前些天無意中在網上看到一篇文章,寫的是幾種腳本語言以及c的速度比較,大意是測試下來lua的速度很慢,只相當于c的1/60左右,看了一下測試函數,如下(命名版本1):
tkstart = os.clock()
local count = 10000000
local accumv = 34.5;
local function iterate (times,accumv)
if 0 == times then
return accumv
else
return iterate (times - 1, accumv + 2)
end
end
print(iterate(count,accumv))
print(os.clock() - tkstart)
這是個迭代調用,理論上這種調用速度不快,所以改寫了一下,命名版本2
tkstart = os.clock()
local i=0.0;
local function process (ret)
while(i < 10000000.0) do
i = i+1.0
ret = ret + 2.0
end
return ret
end
process(34.5)
print(os.clock() - tkstart)
再改寫了一下,版本3,如下:
tkstart = os.clock()
local i=0.0;
local function process (ret)
local t = ret
while(i < 10000000.0) do
i = i+1.0
t = t + 2.0
end
return ret
end
process(34.5)
print(os.clock() - tkstart)
用for循環再改寫了一個版本,版本4,如下:
tkstart = os.clock()
local count = 10000000
local accumv = 34.5;
local function calc (times,accumv)
local result = accumv
for i=1,times do
result = result + 2.0
end
return result
end
print(calc(count,accumv))
print(os.clock() - tkstart)
簡單測試耗時如下
版本1 0.945
版本2 0.484
版本3 0.475
版本4 0.138 編譯成.out跟直接執行.lua耗時差不多,沒明顯變化。
雖然是一個功能很簡單實現也很簡單的lua函數,但速度差別很大,由此可見不同寫法對執行效率影響很大,跟版本4差不多的c程序執行耗時大約為0.016秒, lua大致相當于c的1/8 - 1/9速度,而不是那篇文章的作者認為的只相當于c的1/60。
從上面四個不同代碼大致可以看出以下問題:
1、 迭代算法是很慢的(版本1)。
2、 While的效率比for慢很多(版本23和4的比較)。
3、 臨時變量比參數效率高(版本23)。