lua程序性能优化(尾调用)

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


尾调用可以有效减少栈的开消,减轻函数调用的层次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值