跳转至

JIT 编译器 & 运行时动态自适应优化

从 luajit, pypy 到 v8, jvm, JIT (Just-In-Time) 技术一直是脚本语言或高级语言虚拟机对于性能提升的终极目标。

这些语言选择 JIT 技术的原因有很多,比如:

  1. 脚本语言的运行速度比 native 语言慢很多,很多脚本语言的运行时可能依赖 ast 遍历,而有的运行时可能会使用高级语言虚拟机。脚本语言在实现虚拟机时会使用 switch-threading/call-threading/computed-goto (direct/indirect threading),从而减少指令分派带来的性能衰减,但是这些努力可能远不如直接执行机器码。

  2. 作为字节码高级语言虚拟机,本身就有性能可以媲美 native 语言的目标。原语言由于需要实现某些动态特性,从而无法直接编译到机器码。

  3. 部分运行时希望从 JIT 技术中,通过分析一段高频调用代码的数值类型依赖,从而缓存对应的机器码,在后续的执行中加速执行。

  4. 一些跨平台兼容性软件可以通过将无法在本地 CPU 执行的机器码指令映射到本地可执行的机器码,从而保证软件生态不被破坏。(例如 macOS 的 rosetta)

同时,相比较于与 JIT 使用了相同类似技术的 AOT 而言,JIT 的优点在于:

  1. 可以更快速地启动,可以在运行期间主动识别真正需要优化的代码片段,从而避免生成无关紧要的代码片段的机器码。

  2. 可以一定程度上允许更灵活的类型系统。

学习 JIT 不需要特别高的门槛,但是想要深入还得靠自身努力。相信自己,你也能做到。