Я заметил серьезный удар по производительности, представив один из моих объектов С++ в качестве аргумента функции lua, например.
function luaFunc(someString)
print someString
end
это довольно быстро - менее 30 мс на 100 тыс. вызовов
теперь я добавил еще один объект
function luaFunc(myCObj, someString)
print somestring
myCObj:doStuff()
end
100 тысяч вызовов теперь занимают более 1 секунды. (добавление другого примитива, такого как int или string, в качестве аргумента не влияет на производительность! Кроме того, помещение объекта в глобальную область видимости (например, не нажимайте его каждый раз как func arg, также не влияет на производительность, но мне это нужно в качестве аргумента)
Вот как я это называю, используя luabind
luabind::call_function<void>(fn,myCObj,message);
Я смог сократить время на 0,5 секунды, просто используя функцию luas pcall напрямую — используя этот «хак»:
// 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, ни мой код - я выполнял тест с VS2010 F5, и он автоматически подключал отладчик - по какой-то причине при добавлении MyCObj в качестве аргумента к функции lua - отладчик замедлил всю обработку - я вручную запустил свою программу командной строки из оболочки, и она снова была в допустимых пределах (я узнал это только случайно, потому что более быстрый компьютер с тем же проектом VS занимал 4 секунды вместо 1, которая была маловероятно)