Lua优化技巧

1.大量字符串拼接使用 table.concat() 不能使用运算符…和string.format
  • 创建字符串,Lua会检查内部是否有相同的字符串,如果有直接返回一个引用,如果没有才创建。使得Lua中String的比较和赋值非常地快速。另一方面这个机制使得Lua在拼接字符串上开销比较大,因为在一些直接持有字符串buffer的语言中,往往可以直接把后者的buffer插入到前者的buffer的末尾,而Lua先要遍历查找是否有相同的字符串,然后会把后者整个拷贝然后拼接。

  • 使用table.concat来代替。查看Lua的源码发现,原理是table.concat只会创建一块buffer,然后拼接所有字符串。而用运算符“…”来连接则每次都会产生一串新的字符串,开辟一块新的buffer–》对内存的影响更大,对CPU耗时的影响比较小–>减少GC

  • string.format() 效率低于运算符…

2.使用局部变量比全局变量快,使用效率:local >upvalue>global
  • local变量存放在栈中,upvalue存放在链表中,global存放在全局的表中
  • 案例:
--local
function Add()
	local x=1
	local y=2
	return x+y
end
--upvalue(外部局部变量)
local x,y=1
function Add()
	return x+y
end
--global
function Add()
	return x+y
end
3.Lua table.insert() 添加元素的效率
  • table.inset(tab,1,a)< table.inser(tab,a) < tab[#tab+1]=a < tab[index]=a
  • luajit下性能差距不大
  • 案例:
function table_insert()
    local t = {
    
    }
    for i = 1, 1000, 2 do
        table.insert(t, i)
    end
    return t
end
 
function table_insertL()
    local t, insert = {
    
    }, table.insert
    for i = 1, 1000, 2 do
        insert(t, i)
    end
    return t
end
 
function use_counter()
    local t, c = {
    
    }, 1
    for i = 1, 1000, 2 do
        t[c], c = i, c + 1
    end
    return t
end
 
function use_length()
    local t = {
    
    }
    for i = 1, 1000, 2 do
        t[#t + 1] = i
    end
end
 
--[[------------------------
In Lua (1x)
ID  Case name       t1      t2      t3      t4      t5      avg.    %
1   table.insert G  2.72    2.73    2.72    2.73    2.72    2.724   100%
2   table.insert L  2.24    2.24    2.24    2.24    2.24    2.24    82.23%
3   use counter     1.13    1.13    1.14    1.12    1.13    1.13    41.48%
4   use length      1.43    1.44    1.43    1.43    1.43    1.432   52.57%
--]]------------------------
4.Lua 预分配空间
  • 默认创建出来的表,是空的,在插入元素的过程,逐渐翻倍扩大,从0到1, 1到2,2到4,…都会触发realloc,同时把旧元素拷贝到新申请的空间中,对于最终有成千上万个元素的table,扩张的开销可以接受,但是对于大量生成小的table的场景,会明显拖慢性能,可以通过lua的构造函数,让Lua的编译器预分配空间。
5.持续更新中…

猜你喜欢

转载自blog.csdn.net/baidu_39447417/article/details/105272603