2014-01-05 60 views
6

我每10毫秒程序循环exeucting我的Lua脚本一次。使用相同的Lua_state(luaL_newstate在我的应用程序中调用一次)优化的Lua为周期执行

调用luaL_loadbuffer肯定会非常快速地执行脚本,但每次执行脚本时都不需要执行脚本,因为脚本没有更改。

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

如何优化任何想法? (LuaJIT不是unfortenately的这里选件)

+2

那么...... Lua堆栈的顶部是一个代表块的函数。你不需要多次调用'loadbuffer()' - 只需调用堆栈中的最高值(如果你的脚本返回一个值,操纵堆栈,可能会将函数保存到变量中)。 – 2014-01-05 19:37:07

回答

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

感谢您的回复。一个小脚本的执行时间从8ms降到700us。当重新使用它! –

+0

@JanUlvesten:很高兴听到它!记住你的问题[接受答案](http://stackoverflow.com/help/someone-answers)。 –

3

执行loadbuffer将脚本编译为一段lua代码,您可以将其视为匿名函数。该函数放置在堆栈的顶部。你可以“拯救”的方式,你会在Lua任何其他值:函数推名称压入堆栈,然后调用lua_setglobal(L,名称)。在这之后,你要调用你的函数(块)每一次,你把它压入堆栈的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

感谢您的回复。一个小脚本的执行时间从8ms降到700us。当重新使用它! –