zoukankan      html  css  js  c++  java
  • 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这种方式

  • 相关阅读:
    正则表达式贪婪与非贪婪模式
    GPGPU OpenCL 获取设备信息
    GPGPU OpenCL编程步骤与简单实例
    去掉linux 系统vi中出现^M字符的方法
    OpenMP 线程互斥锁
    CUDA使用Event进行程序计时
    Python日志库logging总结-可能是目前为止将logging库总结的最好的一篇文章
    Python-文件读写及修改
    有关Python的import...和from...import...的区别
    Python中调用其他程序的方式
  • 原文地址:https://www.cnblogs.com/woodjay/p/12627776.html
Copyright © 2011-2022 走看看