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的编译器预分配空间。