Lua 執行迴圈的效能差異

本文 sample code 可以改為 pass by function 方式更為簡潔,但之前文章就先不改動了。
可以參考這篇文章的寫法。


在專案中,對 redis 操作都已經改成全 lua 執行,因為是使用 redis 的關係,對此操作頻率肯定很高。前陣子經同事提醒,關於某些語法效能並不太好,因此對 for, pair, ipair 再次檢驗其效能。

測試條件

  • 迴圈執行次數 一百萬
  • table 長度 1000

選手一 for

1
2
3
4
5
for i=1, loopCount do
for i=1, #table_a do
x = table_a[i]
end
end

選手二 for with local variable length

1
2
3
4
5
6
for i=1, loopCount do
local leng = #table_a
for i=1, leng do
x = table_a[i]
end
end

選手三 pair

1
2
3
4
5
for i=1, loopCount do
for i,v in pairs(table_a) do
x = v
end
end

選手四 ipair

1
2
3
4
5
for i=1, loopCount do
for i,v in ipairs(table_a) do
x = v
end
end

計時

於執行前後加上這兩段

1
2
3
clock_x = socket.gettime()

print(string.format('1. elapsed: %.2f ms', (socket.gettime() - clock_x)*1000 ))

結果

1
2
3
4
1. elapsed: 615.47 ms
2. elapsed: 607.19 ms
3. elapsed: 5255.30 ms
4. elapsed: 1152.29 ms

結論

很明顯的使用 pairipair 效能顯著的差很多,使用上一定要特別注意,尤其是table長度越長,效果差越多。如果是 key/value都需使用的情境下就使用 pair 會好一點,但還是可以從設計上避免。
還有看到一些網路資源,之後再來補完各個語法的效能差異。

使用頻率不高,那就….沒差XD

完整 Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
loopCount = 1000000 --100萬
table_a = {}
for i=1,1000 do
table_a[i]= i
end
require "socket"


clock_x = socket.gettime()
for i=1, loopCount do
for i=1, #table_a do
x = table_a[i]
end
end
print(string.format('1. elapsed: %.2f ms', (socket.gettime() - clock_x)*1000 ))


clock_x = socket.gettime()
for i=1, loopCount do
local leng = #table_a
for i=1, leng do
x = table_a[i]
end
end
print(string.format('2. elapsed: %.2f ms', (socket.gettime() - clock_x)*1000 ))

clock_x = socket.gettime()
for i=1, loopCount do
for i,v in pairs(table_a) do
x = v
end
end
print(string.format('3. elapsed: %.2f ms', (socket.gettime() - clock_x)*1000 ))


clock_x = socket.gettime()
for i=1, loopCount do
for i,v in ipairs(table_a) do
x = v
end
end
print(string.format('4. elapsed: %.2f ms',(socket.gettime() - clock_x)*1000 ))
  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。