为什么使用JIT的解释器生成的代码比没有JIT的代码更快?

2 java compiler-construction interpreter jit jvm-hotspot

我还不清楚JIT编译器将字节码编译成机器码的概念.我想知道为什么它产生比非JIT解释器更快的代码.有人能给我一个关于如何完成这个过程的好例子吗?

Jon*_*eet 20

假设你有一个需要执行一百万次的循环.

"真正的"解释器需要在循环的每次迭代中查看此字节码,并确定代码应对系统状态(调用等)产生的影响.

JIT编译器仅着眼于字节码一次1,并将其编译到,然后可以由计算机直接理解本机代码-不需要进一步的翻译.翻译需要时间,所以如果你只做一次,它会更有效率.

举一个现实世界的例子:如果你有一本英文小说和一些对它感兴趣的法国人,你可以把这本书交给那些懂两种语言的人,他们可以单独向每个人大声朗读.或者,你可以让那个人拿走这本书,把它翻译成法语,然后用法语给每个法国人一本书.如果只有一个人对这本书感兴趣,那么即时翻译会更有效率 - 不需要复制编辑器,布局专家,打印机等...但如果你有很多人想要阅读这本书,然后做一个更彻底的一次性翻译更有意义.


1一些JIT,包括HotSpot中的JIT,实际上会根据使用情况,使用不同的优化级别多次JIT编译相同的代码.