为循环执行优化Lua

为循环执行优化Lua,lua,Lua,我每10毫秒的程序周期执行一次Lua脚本。使用相同的Lua_状态(luaL_newstate在我的应用程序中调用一次) 调用luaL_loadbuffer肯定会很快满足脚本的要求,但似乎没有必要在每次执行脚本时都这样做,因为脚本不会更改 尝试使用lua_dump()保存二进制文件,然后执行它,但lua_pcall()由于某种原因不接受二进制文件 有没有关于如何优化的想法?(LuaJIT在这里不是一个不可原谅的选择) Jan您是正确的,如果代码没有更改,则没有理由重新处理代码。也许您可以做如下操作

我每10毫秒的程序周期执行一次Lua脚本。使用相同的Lua_状态(luaL_newstate在我的应用程序中调用一次)

调用luaL_loadbuffer肯定会很快满足脚本的要求,但似乎没有必要在每次执行脚本时都这样做,因为脚本不会更改

尝试使用lua_dump()保存二进制文件,然后执行它,但lua_pcall()由于某种原因不接受二进制文件

有没有关于如何优化的想法?(LuaJIT在这里不是一个不可原谅的选择)


Jan

您是正确的,如果代码没有更改,则没有理由重新处理代码。也许您可以做如下操作:

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\u call
会从堆栈中删除它调用的函数。这样,就不会丢失对已加载块的引用。

执行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

好。。。Lua堆栈的顶部是一个表示块的函数。您不需要多次调用
loadbuffer()
,只需调用堆栈上的顶部值(如果脚本返回值,则可能将函数保存到变量中,以操作堆栈)。感谢您的回复。一个小脚本的执行时间从8ms下降到700us。当你重新使用它的时候!谢谢你的回复。一个小脚本的执行时间从8ms下降到700us。当你重新使用它的时候@贾努尔维斯滕:很高兴听到这个消息!记住回答你的问题。