4

一般来说,当开发人员试图解释为什么(高度调整的)C++ 比 Java 快 2 倍时,他们提到一个因素是 C++ AOT 编译比 JIT 有更多的时间来进行广泛的优化。所以我假设 Graal 中的 AOT 编译会有类似的机会,因此即使它不如 C++ 快,但它至少会比 JIT 编译快——然而,情况似乎并非如此。这是为什么?特别是,是否存在 Graal 的 AOT 编译器会更快的特定场景?相反,是否存在 JIT 比 GRAAL AOTr 更快的情况?(这样,一旦我完全构建了我的解决方案,我就可以就它的有用性做出明智的决定)?

4

1 回答 1

4

一个因素是 C++ AOT 编译比 JIT 有更多的时间进行广泛的优化。

这不是一个真正的问题。JIT 可以根据需要花费尽可能长的时间进行优化,并且还可以进行多次增量编译运行。这可以在后台线程中完成。

它真正归结为:信息。高度调整的 C++ 速度很快,因为编写它的开发人员使用了所有可用信息来优化代码。这意味着能够做出更多假设或进行巧妙的优化技巧,而 C++ 语言允许您调整所有优化旋钮。

JIT 当然是最好的,但它不一定拥有开发人员应该拥有的关于特定代码段的所有信息,因为它是一个更通用的优化器。在某些情况下,JIT 还具有编译器内在函数,它们基本上是某些方法和代码模式的手动调整替换。同样,这是开发人员利用对特定情况的高级知识进行优化。

但是,对于普通的 Java AOT,情况恰恰相反。因为 AOT 编译器在程序执行之前运行,它对程序运行环境的信息较少,也没有 profiling 信息,因此它无法进行良好的优化。

于 2019-02-23T16:20:25.220 回答