为什么Graals AOT编译器比JIT慢?

时间:2019-01-02 18:33:43

标签: graalvm

通常,当开发人员试图解释为什么(高度优化)C ++比Java快2倍时,他们提到一个因素是C ++ AOT编译比JIT有更多的时间进行广泛的优化。因此,我认为Graal中的AOT编译将有类似的机会,因此即使它不如C ++快,也至少比JIT编译要快-但是,情况似乎并非如此。这是为什么?特别是,在某些特定情况下,Graal的AOT编译器会更快吗?相反,在某些情况下,JIT将比GRAAL AOTr更快吗? (这样,我可以在完全构建解决方案后做出明智的决定)?

1 个答案:

答案 0 :(得分:3)

  

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

这不是真正的问题。 JIT可以根据需要进行优化,并且可以进行多次增量编译。这可以在后台线程中完成。

真正的含义是:信息。高度协调的C ++之所以快速,是因为编写它的开发人员使用了所有可用信息来优化代码。这意味着可以做出更多的假设或做出明智的优化技巧,而C ++语言则允许您调整所有优化旋钮。

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

但是,使用普通的Java AOT确实相反。由于AOT编译器在程序执行之前运行,因此它具有有关程序所运行环境的 less 信息,而没有任何分析信息,因此它执行的优化效果会较差。