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选项)和比较(这是一个很好的方法,代码就像这样简单).答案d)是对的.一般来说,如果不参考所有细节,使用哪种编译器,使用哪种处理器架构等,你都不能多说性能.
我会停止使用该网站作为学习资源并找到另一个网站.
| 归档时间: |
|
| 查看次数: |
375 次 |
| 最近记录: |