Slow FFI.cast in luajit



你能在下面的片段中解释一下FFI.cast的低性能吗?

教授 = 需要"配置文件"本地 FFI = require("FFI")ffi.cdef[[结构消息 {    国际field_a;};]]函数 cast_test1()   bytes = ffi.new("char[100000000]")   总和 = 0   t1 = Prof.rdtsc()   对于 i=1,1000000 do      总和 = 总和 + i   结束   t2 = Prof.rdtsc()   打印("测试1", 到编号(T2-T1))结束函数 cast_test2()   bytes = ffi.new("char[100000000]")   总和 = 0   t1 = Prof.rdtsc()   对于 i=1,1000000 do      总和 = 总和 + i      msg = ffi.cast("struct message *", bytes+ i * 16)-- msg.field_a = i   结束   t2 = Prof.rdtsc()   打印("测试2", 到编号(T2-T1))结束cast_test1()cast_test2()

看起来带有演员的循环运行速度慢了大约 30 倍。有什么想法可以克服这一点吗?

% luajit -v cast_tests.luaLuaJIT 2.0.3 -- 版权所有 (C) 2005-2014 Mike Pall.http://luajit.org/测试1 3227528测试2 94474000

看起来全局 msg 变量是罪魁祸首。将其替换为本地可提高 20 倍的加速:)

它与lualit-2.0.3和lualit-2.1都相关

函数 cast_test3()   本地字节 = ffi.new("char[100000000]")   本地总和 = 0   local t1 = prof.rdtsc()   对于 i=1,1000000 do      总和 = 总和 + i      local msg = ffi.cast("struct message *", bytes+ i * 4)      msg.field_a = i   结束   local t2 = prof.rdtsc()   本地总和2 = 0   对于 i=1,1000000 do      local msg = ffi.cast("struct message *", bytes+ i * 4)      总和2 = 总和2 + msg.field_a   结束   local t3 = prof.rdtsc()   打印(总和,总和2)   打印("Test3", tonumber(T2-T1), tonumber(T3-T2))结束cast_test3()

结果:

%/usr/bin/luajit -v cast_tests.lua ~/Projects/lua_tests/lua_rdtscLuaJIT 2.0.3 -- 版权所有 (C) 2005-2014 Mike Pall.http://luajit.org/500000500000    500000500000测试3 4502508 4850884

最新更新