我注意到一个严重的性能损失,将我的一个c ++对象作为lua函数引入arg,例如。
function luaFunc(someString)
print someString
end
速度相当快 - 100k通话时间不到30ms
现在,我添加了另一个对象
function luaFunc(myCObj, someString)
print somestring
myCObj:doStuff()
end
100k通话现在占用1秒。 (添加另一个原语如int或string作为arg没有性能损失!另外,将对象放入全局范围(例如,不要每次都将它作为func arg推送,也没有性能损失 - 但我需要它作为参数)
这是我用luabind
调用它的方式 luabind::call_function<void>(fn,myCObj,message);
我可以通过简单地直接使用luas pcall函数将时间减少0.5秒 - 使用这个“hack”:
// this will automatically set the correct class metatable for me
luabind::globals(fn.interpreter())["myCObj"] = myCObj;
// push my userdata obj onto the stack including the class metatable
lua_getglobal(fn.interpreter(), "myCObj");
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
不过,我认为它可以更快更好 - 这就是我的想法
void *pUserData = lua_newuserdata( fn.interpreter(), sizeof( MyCClass ) );
pUserData = myCObj;
lua_getmetatable(fn.interpreter(),????);
lua_setmetatable( fn.interpreter(), -2 );
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
所以,我相信luabind管理每个类的一些metatables - 但我不知道如何检索它 - 我在源代码中看到了一些关于“__luabind_classrep” - 另外 - 在全局变量中有一个userdata obj,其名称为i registered我的班级是luabind。
编辑:我实际上追踪了最初的减速问题 - 它既不是luabind也不是我的代码 - 我正在使用VS2010 F5进行基准测试,它会自动附加调试器 - 出于某种原因,将MyCObj作为arg添加到a lua函数 - 调试器减慢了整个处理 - 我从shell手动运行我的命令行程序,它再次在可接受的范围内(我只是意外地认识到这一点,因为具有相同VS项目的更快的计算机需要4秒而不是1这是非常不可能的)答案 0 :(得分:0)
不过,我认为它可以更快更好 - 这就是我的想法
然后停止思考。
无法保证Luabind以特定方式使用userdata。你当然不知道它的userdata是这个类的确切大小;它可以将所有C ++对象包装在某种容器对象中。
简而言之,没有办法知道完全 Luabind如何表示C ++对象。不是没有看Luabind的来源(可能会有变化)。
由于您在Luabind中MyCClass
的不断整理,您很可能会遇到性能问题。避免它的最简单方法是只进行一次编组。使用luabind::object
将对象存储在Lua中。只需用你的翻译创建一个并保持它。然后在调用方法时使用该对象。每次调用函数时,Luabind都不需要重新编组对象。