Lua代码优化点记录

Lua代码优化点记录

1、尽量少用..拼接字符串

function myTest()
    local num = 50000
    local str = "abc"
    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    local temp = ""
    for i = 1, num do
        temp = temp .. str
    end
    local b = os.clock()
    print("Time1---: ", b - a)
    print("-------------------GC1---: ", collectgarbage("count") - start)

    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    local t = {}
    for i = 1, num do
        table.insert(t, str)
    end
    local b = os.clock()
    local temp = table.concat(t)
    print("Time2---: ", b - a)
    print("-------------------GC2---: ", collectgarbage("count") - start)

    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    local format = "%s%s"
    local temp = ""
    for i = 1, num do
        temp = string.format(format, temp, str)
    end
    local b = os.clock()
    print("Time3---: ", b - a)
    print("-------------------GC3---: ", collectgarbage("count") - start)
end

打印结果:

所以推荐用table.concat

2、一个经常使用的全局变量,可以先加载到一个局部变量中

function myTest2()
    local num = 1000000000
    local a = os.clock()
    for i = 1, num do
        math.sin(i)
    end
    print("-------------------Time1: ", os.clock() - a)

    local sin = math.sin
    local a = os.clock()
    for i = 1, num do
        sin(i)
    end
    print("-------------------Time2: ", os.clock() - a)

    local a = os.clock()
    for i = 1, num do
        Const.sin(i) -- Const = {sin = math.sin}
    end
    print("-------------------Time3: ", os.clock() - a)
end

打印结果:

以前傻傻的以为大佬们把全局变量赋值给局部变量是为了少打几个字!!!!!像tolua的Vector3源码这样。

获取全局变量比获取局部变量多了一个重定向的过程,多了一条GETGLOBAL指令!

3、创建大量的小表时

function myTest3()
    local num = 10000000
    local a = os.clock()
    for i = 1, num do
        local temp = {}
        temp[1] = 1
        temp[2] = 2
        temp[3] = 3
    end
    print("-------------------Time1: ", os.clock() - a)

    local a = os.clock()
    for i = 1, num do
        local tmep = {1, 2, 3}
    end
    print("-------------------Time2: ", os.clock() - a)
end

打印结果:

第一种写法有个扩容过程,插入三个值有三次扩容过程(第一次容量变成1,第二次变成2,第三次变成4,容量按2的次幂来扩大),所以创建多个小表的时候推荐第二种写法

4、.和:的使用

function myTest4()
    local num = 100000000
    t = {abc = 1}
    function t.test(i)
        t.abc = i
        local temp = t.abc
    end
    function t.test2(self, i)
        self.abc = i
        local temp = self.abc
    end
    function t:test3(i)
        self.abc = i
        local temp = self.abc
    end
    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    for i = 1, num do
        t.test(i)
    end
    local b = os.clock()
    print("Time1---: ", b - a)
    print("-------------------GC1---: ", collectgarbage("count") - start)

    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    for i = 1, num do
        t.test2(t, i)
    end
    local b = os.clock()
    print("Time2---: ", b - a)
    print("-------------------GC2---: ", collectgarbage("count") - start)

    collectgarbage("collect")
    local start = collectgarbage("count")
    local a = os.clock()
    for i = 1, num do
        t:test3(i)
    end
    local b = os.clock()
    print("Time3---: ", b - a)
    print("-------------------GC3---: ", collectgarbage("count") - start)
end

运行结果:

如果要使用调用对象的话尽量使用冒号(:)

test2方法和test3方法看起来一样的,实际上实现test2比实现test3多一条指令,调用test2取到self需要gettable和getglobal这两条指令,而test3只用self一条指令就可以了!

5、从尾部插入table

function myTest5()
    local num = 10000000
    collectgarbage("collect")
    local t = {}
    local insert = table.insert
    local start = collectgarbage("count")
    local a = os.clock()
    for i = 1, num do
        insert(t, i)
    end
    local b = os.clock()
    print("Time1---: ", b - a)
    print("-------------------GC1---: ", collectgarbage("count") - start)

    collectgarbage("collect")
    local t = {}
    local start = collectgarbage("count")
    local a = os.clock()
    for i = 1, num do
        t[#t + 1] = i
    end
    local b = os.clock()
    print("Time2---: ", b - a)
    print("-------------------GC2---: ", collectgarbage("count") - start)
end

运行结果:

推荐使用t[#t + 1] = i这种方式

原文地址:https://www.cnblogs.com/woodjay/p/12627776.html