luabind получает метатаблицу класса объекта C++, чтобы передать obj в качестве аргумента функции lua

Я заметил серьезный удар по производительности, представив один из моих объектов С++ в качестве аргумента функции 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, которая была маловероятно)


person Steve    schedule 10.07.2012    source источник


Ответы (1)


Тем не менее, я думаю, что это может быть быстрее и лучше - это то, что я думал делать

Тогда перестань думать об этом.

Нет никакой гарантии, что Luabind использует пользовательские данные именно таким образом. Вы, конечно, не знаете, что пользовательские данные точно соответствуют размеру класса; он может обернуть все объекты C++ в какой-то объект-контейнер.

Короче говоря, невозможно узнать точно, как Luabind представляет объект C++. Не без просмотра источника Luabind (который может быть изменен).

По всей вероятности, у вас проблемы с производительностью из-за постоянного маршалинга вашего MyCClass в Luabind. Самый простой способ избежать этого — выполнить маршалинг только один раз. Сохраните объект в Lua, используя файл luabind::object. Просто создайте его с помощью вашего переводчика и держите его под рукой. Затем используйте этот объект при вызове метода. Luabind не нужно будет повторно маршалировать объект каждый раз, когда вы вызываете функцию.

person Nicol Bolas    schedule 10.07.2012
comment
Спасибо за ваше понимание - просто для справки, не могли бы вы объяснить, как я могу преобразовать MyCObj в объект luabind? И где его хранить - в реестре? (у меня несколько диссертаций). Для исходной проблемы - я обновил свой вопрос - это не было связано с luabind - person Steve; 10.07.2012