可能是重复问题:
JIT编译器与离线编译器的区别
直到几分钟前,我并不真正理解JIT编译器和解释器之间的区别。在SO上浏览时,我找到了答案,这也引发了标题中的问题。据我所知,JIT编译器的好处是能够使用它运行的特定处理器,并因此可以制作更好优化的程序。请问有人能给我比较每种方法的优缺点吗?
可能是重复问题:
JIT编译器与离线编译器的区别
直到几分钟前,我并不真正理解JIT编译器和解释器之间的区别。在SO上浏览时,我找到了答案,这也引发了标题中的问题。据我所知,JIT编译器的好处是能够使用它运行的特定处理器,并因此可以制作更好优化的程序。请问有人能给我比较每种方法的优缺点吗?
JIT编译器和解释器的区别
简单来说,解释器将运行字节码(中间代码/语言)。当虚拟机/解释器决定这样做更好时,JIT编译机制将翻译相同的字节码为针对特定硬件的本地代码,并侧重于请求的优化类型。
所以基本上JIT可能会产生更快的可执行文件,但编译需要更长时间?
我认为您所忽略的是JIT编译发生在运行时而不是编译时(与“离线”编译器不同)
编译代码不是免费的,也需要时间。如果它花时间进行编译,然后只运行几次就停止了,那么它可能没有做出一个好的交易。因此,虚拟机仍然需要决定什么被定义为“热点”,并进行JIT编译。
请允许我举例Java虚拟机(JVM):
JVM可以采取开关,通过该开关您可以定义代码被JIT编译的阈值。 -XX:CompileThreshold=10000
为了说明JIT编译时间的成本,假设您将该阈值设置为20,并且有一段需要运行21次的代码。运行20次后,虚拟机将花费一些时间进行JIT编译。现在您有了来自JIT编译的本地代码,但它只能再运行一次(第21次),这可能没有带来任何性能提升以弥补JIT过程。
我希望这说明了问题。
这是一个JVM开关,显示JIT编译的时间-XX:-CITime
“打印JIT编译花费的时间”
旁注: 我不认为这是一个“大问题”,只是因为你提出了这个问题,所以我想指出来。
对我来说,至少缺乏内联汇编是一个大问题。有时,你只是想要对程序的某个小部分完全控制CPU的每个细节。即使我不需要它来完成手头的任务,我也喜欢这个想法:在原则上,我的语言可以做到计算机所能做到的一切。
JIT 编译器更难编写(这不是全部,但值得一提)。