function func()
local value = math.abs(1)
return value
end
function func1()
local value = func()
return value
end
func1()
不使用尾调用的函数编译后指令如下:
F:\>luac -l a.lua
main <a.lua:0,0> (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 <a.lua:1,4> (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 <a.lua:6,9> (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)
end
function func1()
return func()
end
func1()
编译指令如下:
F:\>luac -l a.lua
main <a.lua:0,0> (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 <a.lua:1,3> (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 <a.lua:5,7> (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
尾调用可以有效减少栈的开消,减轻函数调用的层次。lua程序性能优化(尾调用)
最新推荐文章于 2022-07-05 17:13:24 发布