你能在下面的片段中解释一下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