【问题标题】:Slow FFI.cast in luajitluajit 中的慢速 FFI.cast
【发布时间】:2016-02-04 16:30:21
【问题描述】:

您能否解释一下 FFI.cast 在以下 sn-p 中的低性能?

教授 = 需要“个人资料” 本地 ffi = 要求(“ffi”) ffi.cdef[[ 结构消息{ int field_a; }; ]] 函数 cast_test1() 字节 = ffi.new("char[100000000]") 总和 = 0 t1 = 教授.rdtsc() 对于 i=1,1000000 做 总和 = 总和 + 我 结尾 t2 = 教授.rdtsc() 打印(“test1”,tonumber(t2-t1)) 结尾 函数 cast_test2() 字节 = ffi.new("char[100000000]") 总和 = 0 t1 = 教授.rdtsc() 对于 i=1,1000000 做 总和 = 总和 + 我 msg = ffi.cast("结构消息 *", bytes+ i * 16) -- msg.field_a = 我 结尾 t2 = 教授.rdtsc() 打印(“test2”,tonumber(t2-t1)) 结尾 cast_test1() cast_test2()

看起来带有演员表的循环运行速度慢了大约 30 倍。任何想法如何克服这个问题?

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

【问题讨论】:

  • 你试过比较 luajit -jv -jdump 吗?将不同方法的代码放入单独的文件中。第二个循环分配对象并涉及 GC ...
  • 是的,我看到了分配。但问题是如何摆脱它们并有效地使用演员表。
  • 使用local! Lua 没有自动作用域;此示例中的所有变量(ffi 除外)都是全局变量。这会影响性能。

标签: performance casting ffi luajit


【解决方案1】:

看起来全局 msg 变量是罪魁祸首。用本地替换它可以提高 20 倍的速度 :)

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

函数 cast_test3() 本地字节 = ffi.new("char[100000000]") 本地总和 = 0 本地 t1 = prof.rdtsc() 对于 i=1,1000000 做 总和 = 总和 + 我 local msg = ffi.cast("struct message *", bytes+ i * 4) msg.field_a = 我 结尾 本地 t2 = prof.rdtsc() 本地 sum2 = 0 对于 i=1,1000000 做 local msg = ffi.cast("struct message *", bytes+ i * 4) sum2 = sum2 + msg.field_a 结尾 本地 t3 = prof.rdtsc() 打印(总和,总和2) 打印(“test3”,tonumber(t2-t1),tonumber(t3-t2)) 结尾 cast_test3()

结果:

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

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 2017-10-25
    • 2011-06-07
    相关资源
    最近更新 更多