哪个代码在C中执行得更快?

Jay*_*esh 1 c performance loops

我看到了以下代码(PUZZLERSWORLD.COM网站上的问题3 ):

代码1:

for (i = 0; i < 1000; i++)
    for (j = 0; j < 100; j++)
        x = y;
Run Code Online (Sandbox Code Playgroud)

代码2:

for (i = 0; i < 100; i++)
    for (j = 0; j < 1000; j++)
        x = y;
Run Code Online (Sandbox Code Playgroud)

哪个代码执行得更快?

选项:

a) Code 1 and Code 2 are of same speed,
b) Code 1,
c) Code 2,
d) Can't Say
Run Code Online (Sandbox Code Playgroud)

回答:

c)
Run Code Online (Sandbox Code Playgroud)

所以,我有一个问题,为什么第二个代码比第一个快?

Grz*_*ski 13

除非x或之前y声明为volatile,否则两个代码都可以简化为:

x = y;
Run Code Online (Sandbox Code Playgroud)

例:

int f(int y)
{
    int x;

    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 100; j++)
            x = y;
    return x;
}
Run Code Online (Sandbox Code Playgroud)

收益率:

f(int):
        mov     eax, edi
        ret
Run Code Online (Sandbox Code Playgroud)


小智 6

这个问题似乎假定该递增将完成,例如在寄存器中,它是更有效的不具有递增之间进行切换i,并j和重新初始化j过于频繁.这些假设可能适用于某些硬件,但它不太可能产生可衡量的差异.

正确的答案是:" a),任何体面的编译器 ",因为由一个体面的编译器创建的代码不会执行除了x = y;这个源之外的任何东西.(因此两个片段将编译为完全相同的可执行代码)


至于"如何检查",你有两种可能:

  • 编译成汇编代码(例如使用gcc's -S选项)和比较(这是一个很好的方法,代码就像这样简单).
  • 测量.经常运行每个代码(如一百万次)并花时间.


Cod*_*key 6

答案d)是对的.一般来说,如果不参考所有细节,使用哪种编译器,使用哪种处理器架构等,你都不能多说性能.

我会停止使用该网站作为学习资源并找到另一个网站.

  • @stefanbachert:在DS9K上编译时,第二个代码可能比第一个代码慢得多.在优化中没有确定性:对于任何体面的编译器,答案a)是正确的,一般我会选择答案d)但是给定网站,一个被简化为疯狂猜测作为`i`,j`,`x的定义`和`y`并且未知,程序的其余部分,目标环境,编译器细节和配置...... (2认同)