【发布时间】:2013-11-30 00:49:00
【问题描述】:
我的问题一般是关于 JIT 的外部函数接口,但我将使用 LuaJIT 作为具体示例。据说LuaJIT的FFI比直接绑定C要快,因为调用C函数可以编译JIT。
谁能解释一下。通常,被绑定的 C 函数已经存在于库中,因此它已经被编译,那么究竟是什么被 JIT 化了。
【问题讨论】:
我的问题一般是关于 JIT 的外部函数接口,但我将使用 LuaJIT 作为具体示例。据说LuaJIT的FFI比直接绑定C要快,因为调用C函数可以编译JIT。
谁能解释一下。通常,被绑定的 C 函数已经存在于库中,因此它已经被编译,那么究竟是什么被 JIT 化了。
【问题讨论】:
LuaJIT extensions: the FFI Library
[...] JIT 编译器生成的用于从 Lua 代码访问 C 数据结构的代码与 C 编译器生成的代码相同。 与通过经典 Lua/C API 绑定的函数的调用不同,可以在 JIT 编译的代码中内联对 C 函数的调用。
在回答您关于编译什么的问题时,就是这样:调用 到 C 函数。事实上,通过经典 C API 对 C 函数的调用将永远不会被编译,即使在 LuaJIT 的未来版本中也是如此。他们将引发NYI 消息,导致任何跟踪中止并有效地阻止周围的Lua 代码被编译。例如,循环中的经典 C 函数调用 FUNCC 操作码将阻止该循环被编译。这只是意味着 LuaJIT 将退回到它的解释器,这仍然是相当快的。
重申一下,LuaJIT 不会对已编译的 C 代码执行任何魔法。它只是将 FFI 调用内联到 JIT 汇编代码中的 C 函数。
【讨论】:
luajit -jdump,看看它会产生什么并了解编译器的工作原理。