1

这是:

int x=0;
for (int i=0;i<100;i++) 
    x++;
for (int i=0;i<100;i++) 
    x--;
for (int i=0;i<100;i++) 
    x++;
return x;

与此相同:

int x=0;
for (int i=0;i<100;i++){
    x++;
    x--;
    x++;
}
return x;

注意:这只是一个例子,真正的循环会复杂得多。

那么这两个循环是相同的还是第二个更快?

编辑: Java 或 C++。我想知道两者。
我不知道编译器实际上会优化代码。

4

2 回答 2

3

未优化:三个循环需要更长的时间,因为有组循环操作码。

优化,它取决于优化器。一个好的优化器可能足够聪明,能够意识到x++;x--;单循环版本中的语句相互抵消并消除它们。一个非常聪明的优化器可能能够用单独的循环做同样的事情。一个非常聪明的优化器可能会弄清楚代码在做什么,然后将整个块替换为return 100; (请参阅下面的添加注释)

但优化的实际答案通常是:fuhgeddaboutit。如果您的代码能够正确完成其工作,并且速度足够快而有用,请不要理会它。只有当实际测试表明它太慢时,您才应该分析以识别瓶颈并用更高效的代码替换它们。(或者完全是一个更好的算法。)

程序员很昂贵,CPU 周期很便宜,而且还有很多其他任务可以获得更大的回报。写起来也更有趣。


关于“可笑的智能优化器”位:D 语言提供编译时函数评估。CTFE 允许您在构建时使用该语言的几乎全部功能来计算某些内容,然后仅将计算出的答案插入运行时代码中。换句话说,您可以将整个编译器显式转换为选定代码块的优化器。

于 2013-03-06T07:39:50.623 回答
1

如果您将每个递增、递减、赋值和比较算作一个操作,那么您的第一个示例有大约 900 个操作,而您的第二个示例有大约 500 个操作。也就是说,如果代码按原样执行而不是优化。哪个性能更高应该很明显。

实际上,代码可能会或可能不会被编译器优化,不同语言的不同编译器在优化方面会做完全不同的工作。

于 2013-03-06T07:37:04.977 回答