luajit(www.luajit.org)是lua的一个Just-In-Time也就是运行时编译器,也可以说是lua的一个高效版。
原生lua、luajit的jit模式(pc和安卓可用),luajit的interpreter模式(ios下只能运行这个)。
1.jit与interpreter 模式的区别
【jit】
luajit并不是直接将lua转为机器码,而是先以luajit的bytecode在runtime中iterpreter模式运行,iterpreter运行中发现某段代码经常被执行就会开启记录模式,记录这段代码的细节,推测变量的类型,记下来->SSAIR->机器码。
以trace compiler方案推测着运行机器码,用固定的内存访问而不是查表操作,所以速度更快。
luajit为了极限级的性能,就会大胆进行假设,如果发现a+b就是两个数值相加,就编译出数值求和的机器码。
但是如果某一时刻a+b不是数值相加,而是变成了两个表相加呢?这机器码岂不是就导致错误了?因此每次luajit做了假设时,都会加上一段守护代码(guard),检查假设是不是对的,如果不对,就会跳转出去,再根据情况,来决定要不要再编译一段新的机器码,来适配新的情况。
一旦jit失败会比原先的interpreter更耗!
【interpreter】
interpreter模式下(ios的情况),luajit就变成了老老实实动态检查动态跳转的执行模式,对分支预测反而并不敏感,并不需要过分注重这方面的优化。
因此interpreter模式是必须的。
interpreter模式夸平台稳定性足够,性能行为也基本接近原生lua(不会像jit模式有各种trace compiler带来的坑),但是性能依然比原生lua有绝对优势(平均可以快3~8倍,虽然不及jit模式极限几十倍的提升)
2. 如何打开Jitlua 的interpreter模式?非常简单,最你执行第一行lua前面加上:
if jit then
jit.off() --关闭 jit 模式
jit.flush() --打开 interpreter 模式
end