2016-04-29 27 views
0

ルアは高速のスクリプト言語と言われています。しかし、ループをテストしたとき:なぜLuaループが遅いですか?

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

多くの時間(1分以上)がかかる。ループのコンテンツをコピー&ペーストしてから評価する必要があるのでしょうか?

評価するとき、スタックからアイテムをポップする必要があることはわかっています。

Rubyでもこの「スピードテスト」をテストしたところ、約20秒でループが実行されました。

編集: ローカル変数でこれがずっと速いのはなぜですか? (同じ繰り返しを実行するのに〜関数内のローカル変数を実行するまで〜16秒)

+0

遅いどのように遅い:ここ

コードはありますか?実行時間はどのようになっていますか? –

+0

1分以上。すぐに投票しないでください。私の質問で何が間違っているか教えてください。 – LUCAS

+4

まず最初に、Luaはそれをコピー・ペーストしませんl01 – warspyking

答えて

3

ループは非効率的で実用的ではありません。

10億回の繰り返しそれはちょうど「明るい」ではありません。

ループを使用して、数字のforループを使用しているわけではありません。

+0

そして、この「厳密には正確ではない」操作は、C#で実行するのに300ミリ秒のオーダーを要しますが、同じコンピューター上では1μ14秒かかることになります。 *ここに*重大なオーバーヘッドがあります:) –

+1

'for'ループの代わりに6-7秒かかります。 –

+1

@ LasseV.Karlsen C#はコンパイルされた静的型言語ですが、それを比較することすらできません。これらはスクリプト言語であり、Pythonでは2.5分以上もかかりました。 –

6

下記のコードを試してください。これは、vs 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)) 
+0

2番目の数字は何を表していますか? – user6245072

+0

また、LuaJITを使用していますか?バニラルアを終えるのに3分ほどかかりました。 – user6245072

+3

@ user6245072 2番目の数値は、最初の最も遅いループに対する%%の速度差です。それはLuaJITではありません。私はバニラルア5.1.5でそのサンプルを実行し、おそらくより速いCPUのために、さらに小さな時間を得ました。 LuaJITはx10倍の小さな数字を与え、180msの最初のループ仕上げさえも私に与えます。しかし、そのテストの実際の重要性は、アクセス速度の面でグローバル変数とローカル変数がどのように異なるかを示すことです。 – Vlad

関連する問題