跳到主要内容

Lua ↔ C# 交互性能对比

正式结论仅引用 Il2Cpp Player(Mono Editor 不代表发布性能)。

基准工程: focus-creative-games/zlua-benchmark(ZLua / xLua / toLua / SLua 四方对齐)。 最新报告: comparison_20260728_121554.md

Unity2022.3.62f3 · Il2Cpp · C++ Release · Win64
统计预热后 5 轮 mid ns/opratio = 其他 / ZLua(>1 表示比 ZLua 慢)
范围cs2lua 54 + lua2cs 231;未含 Delegate 稳态;未测 GC Alloc(见 GC

复现:仓库 README 中 run_benchmark.ps1(或 -CompareOnly)。


实测摘要

相对 ZLua 的平均 ratio:

方向casesxLuatoLuaSLua
Lua→C#2312.57×3.52×7.68×
C#→Lua541.59×3.27×14.9×

相对 xLua:约 98.6% 用例领先(281/285)。逐 case 见完整报告。

代表 case(ns/call mid)

场景case_idZLuaxLuaratio
无参方法lua2cs.instance.method.0arg.void21.5758.642.72
prop get intlua2cs.instance.prop.get.int21.6779.033.65
field get intlua2cs.instance.field.get.int21.3275.233.53
field set Vector3lua2cs.instance.field.set.Vector322.8090.903.99
C#→Lua classcs2lua.class.3arg.ret94.00461.004.90
C#→Lua int[]cs2lua.int[].3arg.ret92.00601.006.53

toLua / SLua 同 case 数值见报告。

读数注意: 互调即使快数倍,若边界只占帧时间一小部分,整帧收益有限——先 profiling。string / 重对象场景 marshal 占主导时,方案差距会缩小。


为什么更快

xLua / toLua / SLua 的典型热路径要经过 C# Wrap + 多次 Lua 绑定 / P/Invoke(如 LuaDLL) 再进目标方法;栈读写每次数次跨界。

ZLua Player 在 与 lua 同链接域的 C++ 里一次完成:读栈 → marshal → methodPointer(或字段 offset)→ 写栈,没有 per-type C# Wrap,也没有反复 native↔managed 折返。

根因效果
无 libxlua / 多层 P/Invoke 往返栈操作不再每次跨界
无生成 C# Wrap(Lua→C#)C++ 直桥 + methodPointer
C#→Lua 经缓存 Delegate 一次桥接非 C# 循环调 LuaDLL
字段 / 无参属性快路径Il2Cpp offset 直读

因此轻量 int / 字段场景领先更明显;marshal 很重时差距收敛——与实测一致。桥体积与 stub 复用见 BRIDGE


相关文档

文档内容
zlua-benchmark可复现基准与最新报告
GC.md分配与「零 GC」边界
BRIDGE.mdstub 体积与间接层
FEATURES.md功能差异