lua程式效能優化 尾呼叫

2021-06-19 18:16:58 字數 2882 閱讀 3108

function func()

local value = math.abs(1)

return value

endfunction func1()

local value = func()

return value

endfunc1()

不使用尾呼叫的函式編譯後指令如下:

f:\>luac -l a.lua

main (7 instructions, 28 bytes at 003759e8)

0+ params, 2 slots, 0 upvalues, 0 locals, 2 constants, 2 functions

1 [4] closure 0 0 ; 00375b40

2 [1] setglobal 0 -1 ; func

3 [9] closure 0 1 ; 00375e20

4 [6] setglobal 0 -2 ; func1

5 [11] getglobal 0 -2 ; func1

6 [11] call 0 1 1

7 [11] return 0 1

function (6 instructions, 24 bytes at 00375b40)

0 params, 2 slots, 0 upvalues, 1 local, 3 constants, 0 functions

1 [2] getglobal 0 -1 ; math

2 [2] gettable 0 0 -2 ; "abs"

3 [2] loadk 1 -3 ; 1

4 [2] call 0 2 2

5 [3] return 0 2

6 [4] return 0 1

function (4 instructions, 16 bytes at 00375e20)

0 params, 2 slots, 0 upvalues, 1 local, 1 constant, 0 functions

1 [7] getglobal 0 -1 ; func

2 [7] call 0 1 2

3 [8] return 0 2

4 [9] return 0 1

使用尾呼叫以後,

function func()

return math.abs(1)

endfunction func1()

return func()

endfunc1()

編譯指令如下:

f:\>luac -l a.lua

main (7 instructions, 28 bytes at 003759e8)

0+ params, 2 slots, 0 upvalues, 0 locals, 2 constants, 2 functions

1       [3]     closure         0 0     ; 00375b40

2       [1]     setglobal       0 -1    ; func

3       [7]     closure         0 1     ; 00375ec8

4       [5]     setglobal       0 -2    ; func1

5       [9]     getglobal       0 -2    ; func1

6       [9]     call            0 1 1

7       [9]     return          0 1

function (6 instructions, 24 bytes at 00375b40)

0 params, 2 slots, 0 upvalues, 0 locals, 3 constants, 0 functions

1       [2]     getglobal       0 -1    ; math

2       [2]     gettable        0 0 -2  ; "abs"

3       [2]     loadk           1 -3    ; 1

4       [2]    tailcall        0 2 0

5       [2]     return          0 0

6       [3]     return          0 1

function (4 instructions, 16 bytes at 00375ec8)

0 params, 2 slots, 0 upvalues, 0 locals, 1 constant, 0 functions

1       [6]     getglobal       0 -1    ; func

2       [6]     tailcall        0 1 0

3       [6]     return          0 0

4       [7]     return          0 1

尾呼叫可以有效減少棧的開消,減輕函式呼叫的層次。

優化程式效能

編寫高效程式需要兩個活動 第一,我們必須選擇一組最好的演算法和資料結構 第二,我們必須編寫出編譯器能夠有效優化以轉換成高效可執行 的源 這裡,我們主要講述後者。首先,我們討論一下為什麼要編寫高效程式。不難想象,如果本來要用 天執行完的程式,經過優化只需要 天就可執行完,這是一件多麼令人振奮的 事啊。...

優化程式效能

l 消除迴圈的低效率 n 對於迴圈中的過程呼叫盡量移出迴圈外,例如 nfor i 0 i strlen s i strlen 函式為線性增長 在字串長度很大時 很消耗系統資源 n 減少不必要的儲存器引用,將儲存器引用儲存在臨時變數中.l 處理器優化 即充分利用儲存器流水線操作的吞吐量 n 迴圈展開,...

優化程式效能

研究彙編 是理解編譯器以及產生的 會如何執行的最有效的手段之一。編譯器優化 的限制 1 程式設計中存在 儲存器別名使用 的問題。編譯器必須假設不同的指標可能指向儲存器中相同的位置。2 函式呼叫 簡略了。具體看書 基本的編碼原則 效能大幅度提公升 優化程式效能的一些方法 1 將除錯完的程式完成編譯器級...