2014-01-05 4 views
6

Я выполняю сценарий Lua один раз в течение программного цикла 10 мс. используя один и тот же Lua_state (luaL_newstate, вызываемый один раз в моем приложении)Оптимизация Lua для циклического выполнения

Вызов luaL_loadbuffer соответствует сценарию очень быстро, но все равно не нужно делать это каждый раз, когда скрипт выполняется, так как сценарий не изменяется.

Попытался сохранить двоичный файл с помощью lua_dump(), а затем выполнить его, но lua_pcall() по какой-то причине не принимал двоичный код.

Любые идеи о том, как оптимизировать? (LuaJIT не является unfortenately варианта здесь)

Jan

+2

Ну ... верхняя часть стека Lua - это функция, представляющая кусок. Вам не нужно вызывать 'loadbuffer()' более одного раза - просто вызывайте верхнее значение в стеке (возможно, сохраните функцию в переменной, если ваш скрипт возвращает значение, манипулируя стеком). –

ответ

8

Вы правы, если код не меняется, нет никаких оснований для повторной обработки коды. Может быть, вы могли бы сделать что-то вроде следующего:

luaL_loadbuffer(state, buff, len, name); // TODO: check return value 
while (true) { 
    // sleep 10ms 
    lua_pushvalue(state, -1); // make another reference to the loaded chunk 
    lua_call(state, 0, 0); 
} 

Вы заметите, что мы просто дублируем ссылку на функцию на вершине стека, так как lua_call удаляет функцию, которую она вызывает из стека. Таким образом, вы не теряете ссылку на загруженный кусок.

+0

Спасибо за ответы. Время исполнения крошечного скрипта сократилось с 8 до 700US. при повторном использовании! –

+0

@JanUlvesten: Рад это слышать! Не забудьте [принять ответ] (http://stackoverflow.com/help/someone-answers) для вашего вопроса. –

3

Выполнение loadbuffer компилирует сценарий в кусок кода lua, который можно рассматривать как анонимную функцию. Функция помещается в верхнюю часть стека. Вы можете «сохранить» его так же, как и любое другое значение в Lua: нажмите имя функции в стек, затем вызовите lua_setglobal (L, name). После этого каждый раз, когда вы хотите вызвать свою функцию (кусок), вы нажимаете ее на стек Lua, вставляете параметры в стек и вызываете lua_pcall (L, nargs, nresults). Lua выведет эту функцию и поместит результаты nresults в стек (независимо от того, сколько результатов возвращается вашей функцией), если больше возвращено, они отбрасываются, если их количество меньше нуля). Пример:

int stat = luaL_loadbuffer(L, scriptBuffer, scriptLen, scriptName); 
// check status, if ok save it, else handle error 
if (stat == 0) 
    lua_setglobal(L, scriptName); 

... 

// re-use later: 
lua_getglobal(L, scriptName); 
lua_pushinteger(L, 123); 
stat = lua_pcall(L, 1, 1, 0); 
// check status, if ok get the result off the stack 
+0

Спасибо за ответы. Время исполнения крошечного скрипта сократилось с 8 до 700US. при повторном использовании! –

Смежные вопросы