lua陣列操作效能測試

lt發表於2016-10-26

lua的表在下標連續時可以當陣列用,此時#表名返回元素個數。

v={}
s=os.clock()
for i=1,1000000 do
 v[#v+1]=i
end

e=os.clock()
print(#v,e-s)

w={}
cnt=0
s=os.clock()
for i=1,1000000 do
 v[cnt+1]=i
 cnt=cnt+1
end

e=os.clock()
print(#v,e-s)
輸出-----
1000000    0.192
1000000    0.097

3種訪問方法。

-- by index
sum=0
s=os.clock()
for i=1,1000000 do
 sum=sum+v[i]
end
e=os.clock()
print(sum,e-s)

-- by pairs
sum=0
s=os.clock()
for a,b in pairs(v) do
 sum=sum+b
end
e=os.clock()
print(sum,e-s)

-- by ipairs
sum=0
s=os.clock()
for a,b in ipairs(v) do
 sum=sum+b
end
e=os.clock()
print(sum,e-s)

輸出-----
500000500000    0.07
500000500000    0.087
500000500000    0.094

如果中間有空值,pairs會自動忽略,就比下標挨個判斷是否為空快了。

v[10]=nil
print(#v)

-- by index
sum=0
s=os.clock()
for i=1,1000000 do
  if v[i]~=nil then
    sum=sum+v[i]
  end
end
e=os.clock()
print(sum,e-s)
-- by pairs
sum=0
s=os.clock()
for a,b in pairs(v) do
 sum=sum+b
end
e=os.clock()
print(sum,e-s)
輸出-----
1000000
500000499990    0.125
500000499990    0.091

下標不從1開始或不連續,#表名的結果都是錯的

v1={}
v1[0]=1
v1[1]=3
v1[2]=9
print(#v1)
print(v1[0])

v2={}
v2[0]=1
v2[2]=3
v2[5]=9
print(#v2)

輸出----
2
1
0

相關文章