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.持續更新中…
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章