a = 0
while a < 1000000000 do
a = a + 1
end
需要花费很多时间(超过1分钟)。是因为Lua需要复制和粘贴循环内容,然后评估?
我知道在评估时你需要将pop()项远离堆栈。
我在Ruby上测试了这个“速度测试”,它在大约20秒内完成了循环。
编辑: 为什么局部变量的速度要快得多? (〜16秒进行相同的迭代但是在函数内的局部变量上)
答案 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
循环。