2016-05-19 16 views
5

それはどのようにコードのこの部分可能ということである。値を宣言

local t 
for n = 0, 255 do 
    t = math.random(0, 255) 
    ... 
end 

は実際にこの1より遅いですか?

for n = 0, 255 do 
    local t = math.random(0, 255) 
    ... 
end 

私は...部分に何度もt多くのアクセスおりますので、私は疑問に思って、forループは、ローカル変数の独自のセットを持っていますか?はいの場合、現在のブロックからローカル変数にアクセスする方が、外側のブロックからアクセスする方が速いのですか?

答えて

7

通常、変数はローカルと宣言します。そして、はい、forループは独自の範囲を作成します。これはより良いコーディングスタイルであり、この例のように、通常はより最適化されています。あなたが見ることができるように

main <t.lua:0,0> (11 instructions at 0000000000538260) 
0+ params, 7 slots, 1 upvalue, 5 locals, 5 constants, 0 functions 
     1  [1]  LOADK   0 -1 ; 0 
     2  [1]  LOADK   1 -2 ; 255 
     3  [1]  LOADK   2 -3 ; 1 
     4  [1]  FORPREP   0 5  ; to 10 
     5  [2]  GETTABUP  4 0 -4 ; _ENV "math" 
     6  [2]  GETTABLE  4 4 -5 ; "random" 
     7  [2]  LOADK   5 -1 ; 0 
     8  [2]  LOADK   6 -2 ; 255 
     9  [2]  CALL   4 3 2 
     10  [1]  FORLOOP   0 -6 ; to 5 
     11  [3]  RETURN   0 1 

main <t.lua:0,0> (13 instructions at 00000000005e8260) 
0+ params, 8 slots, 1 upvalue, 5 locals, 5 constants, 0 functions 
     1  [1]  LOADNIL   0 0 
     2  [2]  LOADK   1 -1 ; 0 
     3  [2]  LOADK   2 -2 ; 255 
     4  [2]  LOADK   3 -3 ; 1 
     5  [2]  FORPREP   1 6  ; to 12 
     6  [3]  GETTABUP  5 0 -4 ; _ENV "math" 
     7  [3]  GETTABLE  5 5 -5 ; "random" 
     8  [3]  LOADK   6 -1 ; 0 
     9  [3]  LOADK   7 -2 ; 255 
     10  [3]  CALL   5 3 2 
     11  [3]  MOVE   0 5 
     12  [2]  FORLOOP   1 -7 ; to 6 
     13  [4]  RETURN   0 1 

二枚を:

はのは、2つのコードが最初の作品luac -l

で、生成されているどのような指示を見てみましょう。最初の部分には2つの追加の指示があります。そのうちの一つは、ループ内にある:これは何

 11  [3]  MOVE   0 5 

は、変数tがどこにあるかであるレジスタ0()に、math.randomの結果を持っているレジスタ5(に結果を移動することであり、

+0

いいえ、ループには独自のスコープがあり、外側スコープからのローカル変数へのアクセスは遅くなりますが、外側スコープからのローカル変数へのアクセスはグローバル変数へのアクセスよりも遅いですか? – user6245072

+0

上記のコードでは、ループの外側で 'local rand = math random'を宣言し、ループの中で' rand'を呼び出すことは可能ですか? – user6245072

+0

@ user6245072答えははいです。ループが長い場合は、ループ外のローカル変数に関数を割り当てるとパフォーマンスが向上します。これに関する詳細は[* Lua Programming Gems *](http://www.lua.org/gems/)の第2章で解説しています。 –