2016-05-19 41 views
5

Jak to możliwe, że ten kawałek kodu:Deklarując wartość jako lokalny raz jest wolniejszy niż deklarowania lokalny każdym razem

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

Czy rzeczywiście wolniej niż ten?

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

Ponieważ mam dostępu t więcej niż jeden raz w ... strony, zastanawiam się, czy for pętle mają swój własny zestaw zmiennych lokalnych? Jeśli tak, to uzyskuje dostęp do zmiennej lokalnej z bieżącego bloku szybciej niż dostęp do jednego z zewnętrznego bloku?

Odpowiedz

7

Ogólnie, zadeklaruj zmienne jako lokalne, jak to możliwe. I tak, pętla for tworzy swój własny zakres. Jest to lepszy styl kodowania i, jak pokazuje ten przykład, zwykle jest bardziej zoptymalizowany.

Zobaczmy, co instrukcje te dwa fragmenty kodu są generowania, z luac -l

pierwszy kawałek:

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 

Drugi kawałek:

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 

Jak widać. Pierwszy utwór ma dwie dodatkowe instrukcje. Jednym z nich jest wewnątrz pętli.

 11  [3]  MOVE   0 5 

Co to jest przenieść wynik w rejestrze 5 (który ma wynik math.random do rejestru 0 (czyli tam, gdzie zmienna t jest) I

+0

Ok, więc dla pętli mają one własny zakres, a dostęp do zmiennej lokalnej z zewnętrznego zakresu jest wolniejszy, ale uzyskuje dostęp do zmiennej lokalnej z zewnętrznego zakresu wolniej niż dostęp do zmiennej globalnej też? – user6245072

+0

I to znaczy, czy w powyższym kodzie opłacalne jest zadeklarowanie 'local rand = math random 'poza pętlą, a następnie wywołanie' rand' wewnątrz pętli? – user6245072

+0

@ user6245072 Odpowiedź brzmi: tak. Jeśli pętla jest długa, przypisanie funkcji do zmiennej lokalnej poza pętlą ma lepszą wydajność. Rozdział 2 [* Lua Programming Gems *] (http://www.lua.org/gems/) mówi o tym dogłębnie. –