我在想,由于JIT的固有优势(可以使用仅在运行时可用的信息),JIT编译器最终将在编译代码的性能方面击败AOT编译器。一个论点是,AOT编译器可以花更多的时间来编译代码,但是服务器VM也可以花很多时间。

我确实了解到,在某些情况下,JIT似乎击败了AOT编译器,但在大多数情况下,它们似乎仍然落后。

所以我的问题是,阻止JIT编译器击败AOT编译器的具体,棘手的问题是什么?

编辑:
一些常见的论点:

  • AOT编译器可以花更多的时间进行高级优化-> 如果服务器虚拟机运行了几天,则可以花费相同的时间,甚至更长的时间。
  • 字节码解释需要付出成本-> 这些天,大多数JIT编译器仍然会缓存本机指令。

  • 另一个编辑:
    有关特定示例,请参见本文:Improving Swing Performance: JIT vs AOT Compilation。从本文中我可以得出的结论是,作者基本上是在说,当没有热点时,具有运行时信息的优势就会减少,因此无需JIT开销的AOT就可以胜出。但是减少了40%?这似乎没有多大意义。只是比较的JIT编译器没有针对这种情况进行调整吗?还是更根本的东西?

    最佳答案

    在JIT和AOT(提前)编译之间有一个明确的权衡

    如您所述,JIT可以访问有助于优化的运行时信息。这包括有关正在执行的计算机的数据,从而实现特定于平台的本机优化。但是,JIT还具有将字节码转换为本地指令的开销。

    在需要快速启动或接近实时响应的应用中,这种开销通常很明显。如果计算机没有足够的资源来进行高级优化,或者代码的性质无法“积极地进行优化”,则JIT效果也不佳。

    例如,取自the article you linked:



    AOT编译器还可以根据需要花费很多时间进行优化,而JIT编译则受时间要求(以保持响应性)和客户端计算机资源的约束。因此,AOT编译器可以执行复杂的优化,这在JIT期间可能会过于昂贵。

    另请参见此SO问题:JIT compiler vs offline compilers

    10-06 10:31
    查看更多