Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 为什么Lua循环速度慢?_Performance_Lua - Fatal编程技术网

Performance 为什么Lua循环速度慢?

Performance 为什么Lua循环速度慢?,performance,lua,Performance,Lua,据说Lua是一种快速脚本语言。但当我测试循环时,例如: a = 0 while a < 1000000000 do a = a + 1 end a=0 而

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

a = 0
while a < 1000000000 do
    a = a + 1
end
a=0
而<1000000000则可以
a=a+1
结束
这需要很多时间(超过1分钟)。是因为Lua需要复制和粘贴循环的内容,然后进行评估吗

我知道在计算时需要将()项从堆栈中弹出

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

编辑:
为什么这在局部变量上要快得多?(~16秒进行相同的迭代,但使用函数内部的局部变量)

您的循环效率低下且不实用

您正在进行10亿次迭代。这不完全是“光”


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

试试下面的代码。它比较循环和全局变量与局部变量之间的差异

我得到了这些数字(Lua5.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))
local N=1e8
t0=操作系统时钟()
a=0
而a
慢到底有多慢?你的执行时间是多少?超过一分钟。请不要马上投票反对。首先,请告诉我我的问题出了什么问题。首先,Lua不会复制粘贴它。一个可能的原因是Lua变量是变量,它们可以是任何类型,任何时间,这意味着您的语句
a=a+1
必须首先确定要使用哪个
+
运算符,以及是否转换任何操作数。与
a<10000….
一样,它必须找出哪一个
3倍的速度慢并不是开始担心速度慢的原因:)试试LuaJIT,它将在这个基准测试中击败Ruby。然而,这个“不太轻”的操作在C#中运行大约需要300毫秒,但在lua中的同一台计算机上运行需要1m14s。这里有很大的开销:)一个
for
循环需要6-7秒。@LasseV.Karlsen C#是一种编译的静态类型语言,您甚至无法进行比较。这些都是脚本语言,在Python上我甚至花了超过2.5分钟的时间。我知道,这是一种基线比较,而不是对lua实际速度的反映。我认为这里最重要的部分是了解语言,并且知道对于这个特定场景,
for
的开销要小得多。@LasseV.Karlsen哦,好吧,我误解了你,那么第二个数字代表什么?还有,你用的是LuaJIT吗?我花了大约三分钟的时间完成香草Lua。@user6245072秒数是%%相对于第一个最慢循环的速度差。那不是LuaJIT。我在vanilla lua 5.1.5上运行了这个示例,得到的时间更短,可能是因为更快的cpu。LuaJIT将给出x10倍更小的数字,让我在180毫秒内完成第一个循环。但该测试的实际重要性在于显示全局变量和局部变量在访问速度方面的差异