Lua

LuaJit解析

Jit为什么快?

Posted by Bob on July 29, 2018

luac只有 interpreter模式.

luajit分 interpreter 模式和 jit 模式,

  • AOT(ahead-of-time compilation),只线下(offline)就将源代码编译成目标机器码,这是普遍用在系统程序语言中。也叫静态编译(static compilation)。
  • 动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(AOT)。
  • JIT编译(just-in-time compilation)JIT编译是动态编译的一种特例,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地平台相关的机器码,并进行各种层次的优化,并且保存下来以备下次直接使用,JIT快就快在这里,完成这个任务的编译器称为即时编译器

Luajit运行过程

image

LuaJIT部分平台无法使用

JIT模式在iOS以及其他有权限管制的平台(PS4,XBox)都不能使用。

为了安全,这些系统禁止了用户进程自行申请有执行权限的内存空间,因此无法在运行时编译出一段代码到内存然后执行。

LuaJIT一直稳定性能高吗?

1.JIT会编译出机器码,但供代码执行的内存空间有一定上限。

2.推导的机器码执行的结果不符,造成JIT失败。

3.local变量放在寄存器上,如果local 太多,寄存器不够用。

4.编译热点代码的时间有一定的开销。

5.在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

对于某些代码的编译优化不能完全支持,官方有篇文档介绍如何优化

参考资料:

Lua opcodes

luajit opcodes

luajit source

luajit wiki

Luajit trace compiler

peeking LuaJIT