The LuaJIT FFI 文档 http://luajit.org/ext_ffi_semantics.html提到从 C 调用回 Lua 代码相对较慢,建议尽可能避免使用:
不要将回调用于性能敏感的工作:例如考虑一个数值积分例程,它需要用户定义的函数来积分。从 C 代码中调用用户定义的 Lua 函数数百万次是一个坏主意。回调开销绝对会损害性能。
对于新设计,请避免推送式 API(C 函数为每个结果重复调用回调)。相反,请使用拉式 API(重复调用 C 函数以获得新结果)。通过 FFI 从 Lua 到 C 的调用比相反的方式要快得多。大多数设计良好的库已经使用拉式 API(读/写、获取/放置)。
然而,它们并没有给人任何感觉how muchC 的回调速度较慢。如果我想加速一些使用回调的代码,如果我将其重写为使用拉式 API,我大约可以获得多少加速?有没有人有任何基准来比较使用每种 API 风格的等效功能的实现?
在我的计算机上,从 LuaJIT 到 C 的函数调用有 5 个时钟周期的开销(值得注意的是,与通过普通 C 中的函数指针调用函数一样快),而从 C 调用回 Lua 则有 135 个时钟周期的开销,慢 27 倍。话虽这么说,需要一百万次从 C 调用 Lua 的程序只会给程序的运行时间增加约 100 毫秒的开销;虽然避免 FFI 回调在主要针对缓存内数据的紧密循环中进行操作可能是值得的,但如果调用回调(例如,每个 I/O 操作一次),与I/O 本身的开销。
$ luajit-2.0.0-beta10 callback-bench.lua
C into C 3.344 nsec/call
Lua into C 3.345 nsec/call
C into Lua 75.386 nsec/call
Lua into Lua 0.557 nsec/call
C empty loop 0.557 nsec/call
Lua empty loop 0.557 nsec/call
$ sysctl -n machdep.cpu.brand_string
Intel(R) Core(TM) i5-3427U CPU @ 1.80GHz
基准代码:https://gist.github.com/3726661 https://gist.github.com/3726661
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)