我注意到性能受到严重影响,将我的一个 c++ 对象作为 lua 函数 arg 引入,例如
function luaFunc(someString)
print someString
end
这非常快 - 100k 次调用不到 30 毫秒
现在,我添加了另一个对象
function luaFunc(myCObj, someString)
print somestring
myCObj:doStuff()
end
10 万次通话现在需要超过 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 为每个类管理一些元表——但我不知道如何检索它——我在源代码中看到了一些关于“__luabind_classrep”的东西——另外——在全局中有一个用户数据 obj,其名称是我注册的类罗宾德。
编辑:我实际上追踪了最初的减速问题 - 它既不是 luabind 也不是我的代码 - 我正在使用 VS2010 F5 进行基准测试,它会自动附加调试器 - 出于某种原因,当将 MyCObj 作为 arg 添加到 lua 函数时 -调试器减慢了整个处理速度 - 我从 shell 手动运行我的命令行程序,它再次在可接受的范围内(我只是偶然认识到这一点,因为具有相同 VS 项目的更快的计算机需要 4 秒而不是 1 秒不太可能)