与传统编译器相比,JIT编译器是否有任何缺点?

Mau*_*rus 4 compiler-construction jit

可能重复:
JIT编译器与脱机编译器

所以直到几分钟前我才真正理解JIT编译器和解释器之间的区别是什么.浏览SO,我找到了答案,提出了标题中的问题.据我所知,JIT编译器具有能够使用其运行的特定处理器的优点,因此可以制作更好的优化程序.有人可以给我一个比较各自的利弊吗?

bak*_*kal 11

解释器,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编译器中花费的时间"

旁注: 我不认为这是一个"大问题",只是因为你提出这个问题我想指出的.