繁体   English   中英

为什么一个代码示例比其他代码需要更多时间执行?

[英]Why one sample of code take more time to execute than other?

样本1

for(int i = 0 ; i <= 99 ; i++)
    printf("Hello world");

样本2

printf("Hello world"); // 1st print
printf("Hello world"); // 2nd print
.
.
.
printf("Hello world"); // 100th print

我知道示例1比示例2需要更多的时间来执行,示例2在文本段中需要更多的内存。

但是,我想知道幕后发生的事情。

想象一下这样编写的示例操作序列:

i = 0
if (i <= 99)
print
i++
jump
if (i <= 99)
print
i++
jump
if (i <= 99)
print
i++
jump
...

第二个示例很简单:

print
print
print
print
...

这是极其简化的,但是您应该明白这一点-第一个示例执行了更多的指令来遍历循环。

附带说明-这是编译器经常进行的优化之一-它将展开循环并像没有循环一样对其进行编译。 为此,必须得出值得的结论-请注意,示例二将编译成更多的指令总数,并且将占用更多的内存空间(因此将花费更长的时间加载)。

如果编程正确,示例2中的代码可以更快。

如您所描述的,有100个对printf(“ ...”)的调用; 与参数相同的字符串。 如果编译器是优化的编译器,则它可以检测到您传递的参数完全相同,并且在调用之后不弹出指针,因此无需在下次调用时再次将其推入。

同样,循环之间速度的差异是返回到循环开始所花费的时间。 在当前的架构下,这甚至可能是一个优势,因为整个循环代码都由CPU缓存(这不能通过大量类似的调用集来完成),并且无需进行任何内存访问即可加载指令,以补偿执行循环指令所花费的时间。

但是...即使,即使是使用良好的优化编译器,它也可以检测到您将相同的句子放置了100次并用隐藏的控制变量(如示例1)将fold'em循环放入了循环中,因此您不会有任何区别及时执行。

优化的编译器用于检测此类构造并更改代码以提高效率。

这种材料的一个很好的参考是: http : //en.wikipedia.org/wiki/Compilers : _Principles,_Techniques,_and_Tools

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM