代码的马提努斯举了一个很好的例子,编译器通过计算出乘法来优化运行时的代码:
Martinus代码
int x = 0;
for (int i = 0; i < 100 * 1000 * 1000 * 1000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);在编译时(感谢Abelenky指出这一点)对常数折叠编译器进行优化后的代码
int x = 0;
for (int i = 0; i < 100000000000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);在我看来,这种优化技术似乎微不足道。我想这可能是Sun最近开始使用的技术之一。
我对感兴趣,编译器进行了两种类型的优化
请把每一种优化技术放在一个单独的答案上。
哪种技术在90年代(1)和今天(2)使用编译器?
发布于 2009-06-26 19:06:14
编译器书籍应该提供相当好的资源。
如果这是显而易见的,请忽略它,但是您是在询问低级别的优化,这是编译器唯一能够做到的。在非玩具程序中,高级优化的效率要高得多,但只有程序员才能做到。
发布于 2009-06-26 16:24:34
就买最新版的“龙书”吧。
发布于 2009-06-26 16:16:12
示例中显示的折叠100*1000*1000*1000 => 100000000000的优化不是运行时优化。它发生在编译时。(我甚至不会称它为优化)
我不知道在运行时会发生任何优化,除非计算具有JIT (准时)编译的VM引擎。
在编译时发生的优化范围很广,而且常常不容易解释。但它们可以包括内联小功能、重新排列缓存局部性指令、重新排列指令以获得更好的流水线或超线程处理,以及许多其他技术。
编辑:一些F*ER编辑了我的文章.然后投了反对票。我最初的文章清楚地指出,折叠乘法发生在编译时,而不是如海报所建议的运行时。然后我提到,我并不认为折叠常量是一种很好的优化。前处理器甚至会这么做。
马西:如果你想回答这个问题,那就回答这个问题。不要把别人的答案编辑成他们从未写过的文字。
https://stackoverflow.com/questions/1049927
复制相似问题