【发布时间】:2011-11-27 07:36:10
【问题描述】:
我认为 JIT 编译器最终会在编译代码的性能方面击败 AOT 编译器,这是由于 JIT 的固有优势(可以使用仅在运行时可用的信息)。一个论点是 AOT 编译器可以花费更多时间编译代码,但服务器 VM 也可能花费大量时间。
我确实了解 JIT 在某些情况下似乎确实击败了 AOT 编译器,但在大多数情况下它们似乎仍然落后。
所以我的问题是,阻止 JIT 编译器击败 AOT 编译器的具体棘手问题是什么?
编辑:
一些常见的论点:
- AOT 编译器可以花费更多时间进行高级优化->如果您运行服务器虚拟机数天,您可以花费相同的时间,甚至更长。
- 字节码解释成本-> 现在大多数 JIT 编译器都会缓存本机机器指令。
又一次修改:
具体示例见这篇文章:Improving Swing Performance: JIT vs AOT Compilation。根据我从这篇文章中可以收集到的信息,作者基本上是在说,当没有热点时,拥有运行时信息的优势会降低,因此没有 JIT 开销的 AOT 会获胜。但是40%??这似乎没有多大意义。仅仅是被比较的 JIT 编译器没有针对这种情况进行调整吗?还是更基本的东西?
【问题讨论】:
-
您似乎完全错过了“公正”的概念。编译器性能是由人而不是机器来衡量的。没有人能忍受 10 秒的等待。
-
@Hans Passant:在客户端虚拟机中,我明白了这一点。但是在服务器虚拟机中?例如 JVM 就有这种区别。
-
我想这可以归结为“为什么很难编写一个能够发出优化良好的机器代码的编译器?”。此外,将 Java/JIT 与 C++/AOT 进行比较就是将 Apple 与 Orange 进行比较。 (除非正在讨论特定 Java AOT/JIT?)虽然AOT确实“有更多时间”花在整个过程上,但不要忘记javac已经做得很好编译块——词法分析、解析、一些优化,尽管是“虚拟机”——本身。
-
@Enno Shioji:来自你链接的文章:“40% 的性能胜利从何而来?我们在进一步提高 Swing 性能时意外地找到了答案:没有 hot方法。”
-
@Rob:是的,但这是否会导致 40% 的性能差异?至少,一旦 JIT 检测到热点优化不值得,它就会开始表现得像 AOT。这似乎是一件相当容易解决的事情。
标签: performance compiler-construction jit vm-implementation