无法理解编译器的主要优化

时间:2009-06-26 15:59:42

标签: optimization compiler-construction

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最近开始变得微不足道的技术之一。

我对编译器的两种优化感兴趣:

  1. 在今天的编译器中省略的优化很简单,例如在运行时的Java编译器中
  2. 当今大多数编译器使用的优化
  3. 请将每种优化技术放在单独的答案中。

    90年代(1)和今天(2)使用了哪些编译器技术?

4 个答案:

答案 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.