luabind得到一个c ++对象的类metatable来推动obj作为lua函数的参数

时间:2012-07-10 00:48:16

标签: c++ lua luabind

我注意到一个严重的性能损失,将我的一个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这是非常不可能的)

1 个答案:

答案 0 :(得分:0)

  

不过,我认为它可以更快更好 - 这就是我的想法

然后停止思考。

无法保证Luabind以特定方式使用userdata。你当然不知道它的userdata是这个类的确切大小;它可以将所有C ++对象包装在某种容器对象中。

简而言之,没有办法知道完全 Luabind如何表示C ++对象。不是没有看Luabind的来源(可能会有变化)。

由于您在Luabind中MyCClass的不断整理,您很可能会遇到性能问题。避免它的最简单方法是只进行一次编组。使用luabind::object将对象存储在Lua中。只需用你的翻译创建一个并保持它。然后在调用方法时使用该对象。每次调用函数时,Luabind都不需要重新编组对象。