认识 lua jit

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

 

相关文章

1.github代码实践源代码是lua脚本语言,下载th之后运行thmai...
此文为搬运帖,原帖地址https://www.cnblogs.com/zwywilliam/...
Rime输入法通过定义lua文件,可以实现获取当前时间日期的功能...
localfunctiongenerate_action(params)localscale_action=cc...
2022年1月11日13:57:45 官方:https://opm.openresty.org/官...
在Lua中的table(表),就像c#中的HashMap(哈希表),key和...