考虑这两个函数以及关于它们的两个语句S1和S2.
int work1(int *a, int i, int j) { int x = a[i+2]; a[j] = x+1; return a[i+2] - 3; }
int work2(int *a, int i, int j) { int t1 = i+2; int t2 = a[t1]; a[j] = t2+1; return t2 - 3; }
S1:转换形式work1
到work2
是有效的,即,对于任何编程状态和输入参数,work2
将计算出相同的输出,并且对编程状态时相同的效果work1
.
S2:适用于所有的转化work1
得到work2
总是会提高性能(即减少CPU时间)work2
相比work1
.
S1为假,S2为假
S1为假,S2为真
S1为真,S2为假
S1为真,S2为真
AFAIK:语句S1和s2都是正确的,因为两个程序都是等效的,如果CPU使用了更多的空间,那么执行时间应该更少,反之亦然.因此,选项(4)为真(e.g. Google.com
).
但是,在给定选项(1)的地方是正确的,因为当j == i + 2时,程序将返回不同的结果而S2是错误的,因为它被赋予高级语言.但我没有得到这个解释.
另一个解释说选项(3)是正确的,因为在工作2中只添加了一个额外的变量t1,而不是像在工作1中那样直接计算下标.输出将是相同的.S1是真的.无论如何,添加变量t1和t2都不会改善性能.即S2是假的.
你能澄清一下吗?两种功能是否相同,以及工作2的改善时间是否超过工作1?
David Schwar.. 6
但是,在给定选项(1)的地方是正确的,因为当j == i + 2时,程序将返回不同的结果而S2是错误的,因为它被赋予高级语言.但没有得到这个解释.
答对了.他们都是假的.
S1是假的,因为j
可以相等i+2
,导致a[j]=x+1
改变结果a[i+2] - 3
.
S2是假的(假设没有更多的上下文我们应该假设)因为不可能一般地推断出对于在语义上不同的两位代码,必须比另一位更快.某些CPU可能具有需要四个时钟周期的所有操作,除了需要一个时钟周期且完全等效的时钟周期int x = a[i+2]; a[j] = x+1;
.
不那么愚蠢,work2
可能会使用更多的寄存器work1
,这可能会导致其调用者的性能更差.或者,在函数调用中保存和恢复这些寄存器的成本可能会损害性能.也许work2
只会使用更多的代码缓存并在性能悬崖上推送调用者.也许work2
会缩短几个字节,而纯粹的运气会导致巨大的缓存对齐惩罚.谁知道?
但是,在给定选项(1)的地方是正确的,因为当j == i + 2时,程序将返回不同的结果而S2是错误的,因为它被赋予高级语言.但没有得到这个解释.
答对了.他们都是假的.
S1是假的,因为j
可以相等i+2
,导致a[j]=x+1
改变结果a[i+2] - 3
.
S2是假的(假设没有更多的上下文我们应该假设)因为不可能一般地推断出对于在语义上不同的两位代码,必须比另一位更快.某些CPU可能具有需要四个时钟周期的所有操作,除了需要一个时钟周期且完全等效的时钟周期int x = a[i+2]; a[j] = x+1;
.
不那么愚蠢,work2
可能会使用更多的寄存器work1
,这可能会导致其调用者的性能更差.或者,在函数调用中保存和恢复这些寄存器的成本可能会损害性能.也许work2
只会使用更多的代码缓存并在性能悬崖上推送调用者.也许work2
会缩短几个字节,而纯粹的运气会导致巨大的缓存对齐惩罚.谁知道?