前些天无意中在网上看到一篇文章,写的是几种脚本语言以及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)。