Lua Unpack 效能評比
在使用 lua 的 unpack 語法一定要特別注意,如果已經知道參數的數量,那會強烈建議不要使用 unpack。
測試條件
迴圈執行次數 一百萬 次
table 長度 5
選手一 unpack12345local style1 = function() for i=1, loopCount do local v1,v2,v3,v4,v5 = table.unpack(table_a) endend
選手二 get value directly123456789local style2 = function() for i=1, loopCount do local v1 = table_a[1] local v2 = table_a[2] local v3 = table_a[3] local v4 = table_a[4] local v5 = table_a[5] endend
結果12elapsed: 75.28 ms // style1: unpackelapsed: 0.40 ms // style2
結論如果已經確定知道長度,還是不要使用 unpack 語法,可以看到效率是差到百倍以上。
有的人想到可以使用 # 來取得長度,是也是沒錯,但是要確保丟入參數沒有 nil,不然會算錯。
演示: length of table準備了一組含有 nil 的測試資料…
12345678testTable = { {'value1'}, {'value1', 2}, {'value1', nil}, {'value1', nil, 3}, {nil}, {1}, {1,2}, {1,2,nil}}for i=1, #testTable do print(string.format('%d: %d', i, #testTable[i]))end
結果:
123456781: 12: 23: 1 //{'value1', nil}4: 1 //{'value1', nil, 3}5: 06: 17: 28: 2 // {1,2,nil}
從結果來看,如果不能保證沒有 nil,就還是盡量避免使用 # 取得長度。*還是有方法可以算出正確的長度,但效能上不見得值得
完整 Code12345678910111213141516171819202122232425262728293031323334353637loopCount = 1000000 --100萬table_a = {'value1','value2','value3','value4','value5'}require "socket"local style1 = function() for i=1, loopCount do local v1,v2,v3,v4,v5 = table.unpack(table_a) endendlocal style2 = function() for i=1, loopCount do local v1 = table_a[1] local v2 = table_a[2] local v3 = table_a[3] local v4 = table_a[4] local v5 = table_a[5] endendlocal measureTimeFunction = function(func) clock_x = socket.gettime() func() print(string.format('elapsed: %.2f ms', (socket.gettime() - clock_x)*1000 ))endmeasureTimeFunction(style1)measureTimeFunction(style2)testTable = { {'value1'}, {'value1', 2}, {'value1', nil}, {'value1', nil, 3}, {nil}, {1}, {1,2}, {1,2,nil}}for i=1, #testTable do print(string.format('%d: %d', i, #testTable[i]))end