gpt4 book ai didi

callback - LuaJIT FFI 回调性能

转载 作者:行者123 更新时间:2023-12-01 07:07:26 32 4
gpt4 key购买 nike

LuaJIT FFI docs提到从 C 调用回 Lua 代码相对较慢,建议尽可能避免它:

Do not use callbacks for performance-sensitive work: e.g. consider a numerical integration routine which takes a user-defined function to integrate over. It's a bad idea to call a user-defined Lua function from C code millions of times. The callback overhead will be absolutely detrimental for performance.

For new designs avoid push-style APIs (C function repeatedly calling a callback for each result). Instead use pull-style APIs (call a C function repeatedly to get a new result). Calls from Lua to C via the FFI are much faster than the other way round. Most well-designed libraries already use pull-style APIs (read/write, get/put).


但是,它们并没有说明来自 C 的回调有多慢。如果我有一些代码需要使用回调来加速,那么如果我将它重写为使用拉式 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

关于callback - LuaJIT FFI 回调性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329128/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com