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的編譯器預分配空間。