这是:
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 ++。我想知道两者。
我不知道编译器实际上会优化代码。
答案 0 :(得分:3)
未经优化:三个循环需要更长时间,因为是三组循环操作码。
优化,取决于优化器。一个好的优化器可能足够聪明,可以意识到单循环版本中的x++;x--;
语句相互抵消,并消除它们。一个非常聪明的优化器可能能够使用单独的循环执行相同的操作。一个荒谬的智能优化器可能会弄清楚代码在做什么,只需用return 100;
替换整个块(参见下面添加的说明)
但优化的现实答案通常是:fuhgeddaboutit。如果您的代码正确地完成了它的工作,而且速度足够快,那么请不要管它。只有当实际测试显示它太慢时,您才应该分析识别瓶颈并用更有效的代码替换它们。 (或完全更好的算法。)
程序员价格昂贵,CPU周期便宜,还有很多其他任务需要更大的回报。写作也更有趣。
关于“荒谬的智能优化器”位:D语言提供编译时功能评估。 CTFE允许您使用该语言的全部功能来在构建时计算,然后仅将计算出的答案插入到运行时代码中。换句话说,您可以将整个编译器明确地转换为优化器,以用于选定的代码块。
答案 1 :(得分:1)
如果将每个增量,减量,赋值和比较计为一个操作,则第一个示例有900个操作,而第二个示例有~500。也就是说,如果代码按原样执行而未进行优化。应该是显而易见的,性能更高。
实际上,代码可能会或可能不会被编译器优化,不同语言的不同编译器在优化时会做完全不同的工作。