它是什么
LuaJIT 是 Mike Pall 写的另一份 Lua 实现——Tracing JIT 编译器,速度通常是标准 Lua 的 3-50 倍。
兼容 Lua 5.1 语法 + 借鉴 5.2/5.3 的部分(goto、__pairs 等),但不是 5.4 兼容。
几个事实
- 2.0 稳定(2012);2.1 于 2024-05 正式发布稳定版(此前长期处于 beta,但生产已大规模使用)
- 维护:作者 Mike Pall 早已半退休,社区接手(OpenResty 等公司持续投入)
- 一些大用户:OpenResty / Nginx-Lua、Cloudflare、Redis(曾用,5.0+ 切回纯 Lua)、Roblox(前期)、World of Warcraft(早期)
为什么快
Tracing JIT:解释器执行时记录"热路径"——多次执行的代码被编译成机器码、内联、消除冗余。整数运算、浮点运算、表访问、调用——都能被优化到接近 C 的速度。
但是:JIT 假设代码"热"——只跑一两次的代码不会被编译,依然走解释器。
装 + 跑
brew install luajit # macOS
sudo apt install luajit # Debian/Ubuntu
luajit -v # LuaJIT 2.1.x
luajit script.lua # 像跑标准 Lua 一样
关闭 JIT(调试 / 对比用)
luajit -joff script.lua
或代码里:
jit.off()
FFI:直接调 C
LuaJIT 招牌功能——不写胶水代码调任何 C 库:
local ffi = require("ffi")
ffi.cdef[[
typedef struct { double x, y; } Point;
double sqrt(double x);
int printf(const char *fmt, ...);
]]
print(ffi.C.sqrt(16)) -- 4
local p = ffi.new("Point", {3, 4})
print(p.x, p.y)
ffi.C.printf("(%g, %g)\n", p.x, p.y)
调用速度近乎零开销(远快于 Lua 5.x 的 C 模块绑定)。游戏 / 科学计算 / 网络密集场景必备。
不能用 5.3+ 的新东西
-- 5.3+:整数 / 位运算
local x = 0xF0 & 0x0F -- LuaJIT 报错
-- 5.4:to-be-closed
do
local f <close> = io.open(...)
end
-- LuaJIT 报错
-- 5.3+:goto + label 部分语法
::label:: -- 这个 LuaJIT 支持
| 5.3+ 特性 | LuaJIT 支持 |
|---|---|
| 整数子类型 | ❌(永远 double) |
位运算操作符 & | ~ |
❌(用 bit 库) |
goto/<close> |
goto ✅,close ❌ |
// 整数除法 |
❌(用 math.floor(a/b)) |
\u{...} Unicode 转义 |
❌ |
string.pack/unpack |
❌ |
写 LuaJIT 项目要按 5.1 + LuaJIT 扩展的子集写。
性能写法(LuaJIT 友好)
LuaJIT 有些代码模式特别快,有些会让 JIT 放弃:
-- ✅ 紧致数值循环、ffi 类型 → JIT 起飞
local ffi = require("ffi")
local arr = ffi.new("double[1000000]")
for i = 0, 999999 do arr[i] = math.sqrt(i) end
-- ❌ 在热路径用 pcall / xpcall → 抑制 JIT
-- ❌ 字符串模式匹配 → 大概率走解释器
-- ❌ 长 string.format → JIT 不友好
详见官方 Numerical-Computing-Performance-Guide。
看 JIT 在做什么
luajit -jv script.lua -- 打印 trace 信息
luajit -jdump script.lua -- 详细 IR 输出(调试用)
选不选 LuaJIT
| 选 | 不选 |
|---|---|
| OpenResty / 嵌入到 C/C++ | 想用 Lua 5.4 新特性 |
| 数值密集 / 游戏 | 项目限定标准 Lua(Redis、Lightroom) |
| 已习惯 5.1 + 需要速度 | 团队偏好维护活跃的官方 Lua |
也可以两个都装——开发用标准 Lua 检查语法(lua-language-server 在 5.4 模式严格),跑生产用 LuaJIT。
→ 下一篇 在 Roblox 写 Lua