0

我注意到性能受到严重影响,将我的一个 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 秒不太可能)

4

1 回答 1

0

尽管如此,我认为它可以更快更好 - 这就是我想做的

然后别再想那个了。

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

简而言之,没有办法确切地知道 Luabind 是如何表示 C++ 对象的。并非没有查看 Luabind 的来源(可能会发生变化)。

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

于 2012-07-10T03:42:55.237 回答