当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《两种功能是否相同,以及工作2的改善时间是否超过工作1?》经验,为你挑选了1个好方法。

考虑这两个函数以及关于它们的两个语句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:转换形式work1work2是有效的,即,对于任何编程状态和输入参数,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> David Schwar..:

但是,在给定选项(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会缩短几个字节,而纯粹的运气会导致巨大的缓存对齐惩罚.谁知道?

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有