Martinus gives a good example代码,其中编译器通过计算乘法来在运行时优化代码:
Martinus代码
int x = 0;
for (int i = 0; i < 100 * 1000 * 1000 * 1000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);
他的代码经过Constant Folding -compiler在编译时的优化(Thanks to Abelenky for pointing that out)
int x = 0;
for (int i = 0; i < 100000000000; ++i) {
x += x + x + x + x + x;
}
System.out.println(x);
在我看来,这种优化技术似乎是微不足道的。 我想这可能是Sun最近开始变得微不足道的技术之一。
我对编译器的两种优化感兴趣:
请将每种优化技术放在单独的答案中。
90年代(1)和今天(2)使用了哪些编译器技术?
答案 0 :(得分:4)
购买最新版的龙书。
答案 1 :(得分:1)
示例中显示的优化,折叠为100 * 1000 * 1000 * 1000 =&gt; 100000000000不是运行时优化。它发生在编译时。 (我甚至不称之为优化)
我不知道在运行时发生的任何优化,除非您计算具有JIT(即时)编译的VM引擎。
在编译时发生的优化范围很广,而且通常不易解释。但是它们可以包括内置小函数,重新安排缓存局部性指令,重新安排更好的流水线操作或超线程的指令,以及许多其他技术。
编辑:有些F * ER编辑了我的帖子......然后对其进行了投票。我的原始帖子清楚地表明,在海报建议的情况下,折叠乘法发生在编译时间,而不是运行时间。然后我提到我并没有真正考虑将常量折叠为优化。预处理器甚至可以做到。
马西:如果你想回答这个问题,那就回答这个问题吧。不要编辑其他人的答案,以便输入他们从未写过的单词。答案 2 :(得分:1)
循环展开怎么样?:
for (i = 0; i < 100; i++)
g ();
要:
for (i = 0; i < 100; i += 2)
{
g ();
g ();
}
来自http://www.compileroptimizations.com/。他们还有更多 - 每种技术的答案太多了。
查看Trace Trees以获得很酷的翻译/即时优化。
答案 3 :(得分:0)
编译器书应该提供相当不错的资源。
如果这很明显,请忽略它,但是你要问的是低级优化,这是编译器可以做的唯一优化。 In non-toy programs, high-level optimizations are far more productive, but only the programmer can do them.