为什么Lua循环缓慢?

时间:2016-04-29 10:20:55

标签: performance lua

据说Lua是一种快速编写脚本的语言。但是当我测试循环时,例如:

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

需要花费很多时间(超过1分钟)。是因为Lua需要复制和粘贴循环内容,然后评估?

我知道在评估时你需要将pop()项远离堆栈。

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

编辑: 为什么局部变量的速度要快得多? (〜16秒进行相同的迭代但是在函数内的局部变量上)

2 个答案:

答案 0 :(得分:6)

尝试以下代码。它比较了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))

答案 1 :(得分:3)

你的循环效率低且不实用。

您正在进行十亿次迭代。那不完全是&#34;轻&#34;。

更不用说您使用while循环替换数字for循环。