2014-01-05 117 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。當重新使用它! –