两种功能是否相同,以及工作2的改善时间是否超过工作1?

3 c algorithm performance function time-complexity

考虑这两个函数以及关于它们的两个语句S1和S2.

int work1(int *a, int i, int j)
{
    int x = a[i+2];
    a[j] = x+1;
    return a[i+2] - 3;
}
Run Code Online (Sandbox Code Playgroud)
int work2(int *a, int i, int j)
{
    int t1 = i+2;
    int t2 = a[t1];
    a[j] = t2+1;
    return t2 - 3;
}
Run Code Online (Sandbox Code Playgroud)

S1:转换形式work1work2是有效的,即,对于任何编程状态和输入参数,work2将计算出相同的输出,并且对编程状态时相同的效果work1.

S2:适用于所有的转化work1得到work2总是会提高性能(即减少CPU时间)work2相比work1.

  1. S1为假,S2为假
  2. S1为假,S2为真
  3. S1为真,S2为假
  4. 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?

Dav*_*rtz 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会缩短几个字节,而纯粹的运气会导致巨大的缓存对齐惩罚.谁知道?