为什么Lua循环很慢?

Lua被认为是一种快速的脚本语言。但是当我测试循环时,比如:

a = 0
while a < 1000000000 do
    a = a + 1
end

它需要很长时间(超过1分钟)。是因为Lua需要复制并粘贴循环的内容,然后进行评估吗?

我知道在评估时需要从堆栈中弹出项。

我在Ruby上测试了这个"速度测试",它在大约20秒内完成了循环。

编辑: 为什么本地变量要快得多?(在函数内部的本地变量上进行相同的迭代的时间为16秒)

点赞
用户3979429
用户3979429

你的循环效率低下且不切实际。

你正在进行十亿次迭代。这并不算“轻巧”。

更不用说你正在使用while循环来代替数值型的for循环。

2016-04-29 10:45:05
用户107090
用户107090

试试下面的代码。它比较了 while 循环与 for 循环、全局变量与局部变量的差异。

我用 Lua 5.1.4 执行这段代码得到以下数据,当然,用 5.3.2 得到的结果也很接近,数据显示全局变量在循环中的使用成本:

WG  9.16    100
WL  1.96    467
FG  4.93    186
FL  1.18    776

当然,如果你在循环内做了实际工作,这些成本就会被摊销。

以下是代码:

local N=1e8

t0=os.clock()
a = 0
while a < N do
    a = a + 1
end
t1=os.clock()-t0
print("WG",t1,math.floor(t1/t1*100+0.5))

t0=os.clock()
local a = 0
while a < N do
    a = a + 1
end
t2=os.clock()-t0
print("WL",t2,math.floor(t1/t2*100+0.5))

t0=os.clock()
b = 0
for i=1,N do
    b = b + 1
end
t3=os.clock()-t0
print("FG",t3,math.floor(t1/t3*100+0.5))

t0=os.clock()
local b = 0
for i=1,N do
    b = b + 1
end
t4=os.clock()-t0
print("FL",t4,math.floor(t1/t4*100+0.5))
2016-04-29 12:27:41