2

我仍然不清楚通过 JIT 编译器将字节码编译成机器码的概念。我想知道为什么它比非 JIT 解释器产生更快的代码。有人可以给我一个很好的例子来说明这个过程是如何完成的吗?

4

3 回答 3

27

假设您有一个需要执行一百万次的循环。

“真正的”解释器需要在循环的每次迭代中查看 this 的字节码,并计算出代码对系统状态(调用等)的影响。

JIT 编译器只查看一次字节码1,然后将其编译为本机代码,然后计算机可以直接理解 - 无需进一步翻译。翻译需要时间,所以如果你能做一次,它会更有效率。

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


1一些 JIT,包括 HotSpot 中的 JIT,实际上会根据使用情况,以不同程度的优化对相同的代码进行多次 JIT 编译。

于 2012-01-09T13:21:23.227 回答
1

JIT 编译的代码实际上直接在裸机上运行,​​而解释的代码必须不断地由解释器重新解释。解释器不再需要重新处理和重新处理字节码。

于 2012-01-09T13:28:37.817 回答
0

编译器将我们的高级源代码翻译成字节码并将字节码翻译成机器码,一些实现有普通的解释器,一些有即时编译器。为了执行一个循环,比如说,百万次,JIT 编译器只将字节码转换为机器码一次,并且对于下一次迭代,机器只理解字节码。而普通的解释器,在每次迭代中,都会重复地将字节码翻译成机器码,从而花费更多的时间来完成一个循环,比如百万次。

于 2021-06-09T19:43:40.373 回答