背景
记得在开发一个加解密功能的时候,调用了底层c的模块,通过lua xxx.lua执行耗时在秒级,一直在默默优化就是不行,通过resty执行xxx.lua文件,发现速度提升了10倍左右,为什么这么牛逼呢,就是因为在安装openresty时安装的是lua jit。
从openresty 1.5.8.1开始,默认捆绑的lua解释器就是luajit,而不是原生标准的lua。
什么是LuaJIT
LuaJIT是Lua的即时编译,简单来说就是一个高效的Lua虚拟机。
什么是JIT
官方说明:LuaJIT is a Just-In-Time Compilerfor the Lua programming language。LuaJIT的运行时环境包含一个用手写汇编实现的解释器和一个可以直接生成机器代码的JIT编译器。
注:JIT实际上就是即时编译,在Java中实际上也有JIT,用来提升性能。
为什么使用JIT
对于静态编译的缺点是不够灵活、无法支持热更,而且平台兼容性差。而对于动态解释而言,效率低和代码暴露是其主要缺陷。即时编译混合了动态解释和静态编译,在执行效率上要高于解释执行却低于静态编译。安全性上一般都会将源代码转换成字节码。而无论是源码或是字节码,本质上都是资源,因此可采用热更新机制。在兼容性上,由于虚拟机的存在,可以处理不同平台的差异,对用户保持透明。
LuaJIT流程图
![b1570ade860250f0ea172c7e54a49541.png](https://i-blog.csdnimg.cn/blog_migrate/eba3c2b853b67dfad752b02c0143030d.jpeg)
LuaJIT工作模式
LuaJIT中存在2种工作模式
- JIT模式
** JIT模式即即时编译模式,该模式下会将代码直接翻译成机器码,并向操作系统申请可执行内存空间来存储转换后的机器码。执行时直接执行机器码,所以效率是最高的。但是在iOS、XBox、PS4等平台上,鉴于自身安全原因都是不授权分配可执行内存空间的,所以这些平台下就不能使用JIT模式。 - Interpreter模式
** 翻译器模式,该模式下会将代码先翻译成字节码,然后将字节码翻译成机器码,所以无需向操作系统申请可执行内存空间。所以几乎所有平台都支持此模式,但是性能相比JIT模式而言还有一定的差距
![120b92aa837af2963e62793d767f9375.png](https://i-blog.csdnimg.cn/blog_migrate/d24bcb055067794553912269090d150d.jpeg)