Compiler construction 与传统编译器相比,JIT编译器有什么缺点吗?

Compiler construction 与传统编译器相比,JIT编译器有什么缺点吗?,compiler-construction,jit,Compiler Construction,Jit,可能重复: 所以直到几分钟前,我才真正理解JIT编译器和解释器之间的区别。浏览SO,我找到了答案,在标题中提出了这个问题。据我所知,JIT编译器的优点是能够使用它运行的特定处理器,因此可以生成更好的优化程序。有人能给我比较一下每种解释器、JIT编译器和“离线”编译器的优缺点吗 JIT编译器和 翻译 为了简单起见,让我们假设解释器将运行字节码(中间代码/语言)。当VM/解释器决定最好这样做时,JIT编译机制将把相同的字节码翻译成针对所讨论硬件的本机代码,重点放在所请求的优化类型上 所以基本上JI

可能重复:

所以直到几分钟前,我才真正理解JIT编译器和解释器之间的区别。浏览SO,我找到了答案,在标题中提出了这个问题。据我所知,JIT编译器的优点是能够使用它运行的特定处理器,因此可以生成更好的优化程序。有人能给我比较一下每种解释器、JIT编译器和“离线”编译器的优缺点吗 JIT编译器和 翻译

为了简单起见,让我们假设解释器将运行字节码(中间代码/语言)。当VM/解释器决定最好这样做时,JIT编译机制将把相同的字节码翻译成针对所讨论硬件的本机代码,重点放在所请求的优化类型上


所以基本上JIT可能会产生 更快的可执行文件,但需要更长的时间 编译

我认为您缺少的是JIT编译发生在运行时而不是编译时(与“脱机”编译器不同)

JIT编译有开销 编译代码不是免费的,也需要时间。如果它花时间编译它,然后只运行几次,它可能不会做一笔好交易。因此,VM仍然必须决定将什么定义为“热点”,并对其进行JIT编译

请允许我给出Java虚拟机(JVM)的示例:

JVM可以使用开关定义JIT编译代码的阈值<代码>-XX:CompileThreshold=10000

为了说明JIT编译时间的成本,假设您将阈值设置为20,并且有一段代码需要运行21次。在它运行20次之后,VM将投入一些时间进行JIT编译。现在您已经有了来自JIT编译的本机代码,但它将只运行一次(21次),这可能不会带来任何性能提升来弥补JIT过程

我希望这能说明这一点

下面是一个JVM开关,显示JIT编译所花费的时间
-XX:-CITime
“打印JIT编译器所花费的时间”


旁注:我不认为这是什么“大不了的事”,这正是我想指出的,因为你提出了这个问题。

我想说的是使用JIT编译器的一个真正的缺点(实际上更多的是副作用),JIT编译器的内存开销要大得多,因为除了AOT(提前)编译程序所需的运行库和编译代码外,它们还需要加载编译器和解释器。

JIT编译器更难编写(不是全部,但值得一提)。

< P> JIT编译并不意味着它易于拆解。这是依赖于实现的,例如java二进制文件。但是,注意JIT可以应用于任何类型的可执行文件,无论是java、python还是C++或类似的已编译的二进制文件。(IIRC,Dynamo项目涉及动态重新编译此类二进制文件以提高性能。)

JIT编译的权衡是,虽然流程的目标是提高运行时性能,但流程实际上也发生在运行时,因此在分析、编译和验证代码片段时会产生开销。如果实现效率低下或没有进行足够的优化,那么它实际上会产生性能e退化

另一个权衡是,在某些情况下,JIT编译可能是非常浪费的。例如,考虑一个自修改的可执行文件。如果编译一段代码,然后可执行文件修改该片段,则必须扔掉编译后的片段,然后重新分析该段,以确定它是否值得重新编译。频繁发生,会对性能造成重大影响


最后,内存消耗会受到影响,因为编译后的代码片段必须驻留在内存中才能有效。这可能会使内存有限的设备无法使用,或者很难很好地实现。至少对我来说,缺少内联ASM是一个大问题。偶尔,你只需要完全控制l为你的程序的一小部分检查CPU的每一个细节。即使我手头的任务不需要它,我也喜欢这样的想法,即我的计算机的所有功能原则上都可以用我的语言来完成。

看,我不认为这与另一个问题完全相同,因为另一个问题的要求正好相反这个问题:“JIT编译器是否比其他编译器(如C++)更快?)(如果关闭,我将投票重新打开。)因此,基本上JIT可能会产生更快的可执行文件,但编译所需的时间更长?我不会说它会更长,但程序运行时会有开销。哦,我想我误解了JIT编译器是什么。我假设它在第一次运行时会完全编译程序。它是否也像解释器一样工作?@Maulr美国:这取决于JIT编译器的目标,以及设计者想要支持的优化类型。一些JIT在启动时进行完整的重新编译,其他JIT在确定最需要优化的部分时进行编译。好的,我想我现在已经足够了解了。谢谢!不是这样!Java语言和Java字节码演示了这一点属性,但编译成Java字节码的JRuby程序无法进行全面的反编译。使用苹果的Rosetta将PowerPC程序jitte转换成x86机器代码也是如此。这也不是唯一的缺点。Scala程序经历了几个级别