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
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
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
@ 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. –