使用多个循环与使用多个循环相同的性能?

时间:2013-03-06 07:05:29

标签: loops

这是:

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 ++。我想知道两者。
我不知道编译器实际上会优化代码。

2 个答案:

答案 0 :(得分:3)

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

优化,取决于优化器。一个好的优化器可能足够聪明,可以意识到单循环版本中的x++;x--;语句相互抵消,并消除它们。一个非常聪明的优化器可能能够使用单独的循环执行相同的操作。一个荒谬的智能优化器可能会弄清楚代码在做什么,只需用return 100; 替换整个块(参见下面添加的说明)

但优化的现实答案通常是:fuhgeddaboutit。如果您的代码正确地完成了它的工作,而且速度足够快,那么请不要管它。只有当实际测试显示它太慢时,您才应该分析识别瓶颈并用更有效的代码替换它们。 (或完全更好的算法。)

程序员价格昂贵,CPU周期便宜,还有很多其他任务需要更大的回报。写作也更有趣。


关于“荒谬的智能优化器”位:D语言提供编译时功能评估。 CTFE允许您使用该语言的全部功能来在构建时计算,然后仅将计算出的答案插入到运行时代码中。换句话说,您可以将整个编译器明确地转换为优化器,以用于选定的代码块。

答案 1 :(得分:1)

如果将每个增量,减量,赋值和比较计为一个操作,则第一个示例有900个操作,而第二个示例有~500。也就是说,如果代码按原样执行而未进行优化。应该是显而易见的,性能更高。

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