Uważam, że w AS3 należy zainicjować wszystkie zmienne poza pętlami w celu zwiększenia wydajności. Czy tak jest również w przypadku JavaScript? Który jest lepszy / szybszy / najlepsza praktyka?
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
lub
for (var i = 0 ; i < 100; i++)
{
var value = somearray[i];
}
javascript
performance
dostojny
źródło
źródło
Odpowiedzi:
Nie ma absolutnie żadnej różnicy w znaczeniu lub wydajności w JavaScript lub ActionScript.
var
jest dyrektywą dla parsera, a nie komendą wykonywaną w czasie wykonywania. Jeśli określony identyfikator został zadeklarowanyvar
raz lub więcej w dowolnym miejscu w treści funkcji (*), wówczas wszelkie użycie tego identyfikatora w bloku będzie odnosić się do zmiennej lokalnej. Nie ma znaczenia, czyvalue
deklaruje się, żevar
znajduje się w pętli, poza nią, czy w obu.W związku z tym powinieneś napisać, co uznasz za najbardziej czytelne. Nie zgadzam się z Crockfordem, że umieszczenie wszystkich zmiennych na szczycie funkcji jest zawsze najlepszą rzeczą. W przypadku, gdy zmienna jest używana tymczasowo w sekcji kodu, lepiej zadeklarować
var
w tej sekcji, aby sekcja była samodzielna i można ją było wkleić. W przeciwnym razie skopiuj i wklej kilka wierszy kodu do nowej funkcji podczas refaktoryzacji, bez osobnego wybierania i przenoszenia powiązanychvar
, a otrzymasz przypadkowe globalne.W szczególności:
Crockford zaleci usunięcie drugiego
var
(lub usuń obavar
s i wykonajvar i;
powyższe), a jslint będzie cię za to płakał. Ale IMO jest łatwiejsze w utrzymaniu, zachowując obavar
powiązane kody, zamiast mieć dodatkowy, łatwo zapominany kawałek kodu na górze funkcji.Osobiście staram się zadeklarować jako
var
pierwsze przypisanie zmiennej w niezależnej sekcji kodu, niezależnie od tego, czy istnieje inne oddzielne użycie tej samej nazwy zmiennej w innej części tej samej funkcji. Dla mnie konieczność deklarowaniavar
w ogóle jest niepożądaną brodawką JS (byłoby lepiej, gdyby zmienne były domyślnie lokalne); Nie uważam za swój obowiązek powielać ograniczeń [starej wersji] ANSI C również w JavaScript.(*: inne niż w zagnieżdżonych obiektach funkcyjnych)
źródło
var
jest używane tylko u góry funkcji, wymaga jedynie przypadkowego utworzenia zmiennej globalnej. A posiadanie masy niepowiązanych zmiennych, wszystkie zadeklarowane w jednym miejscu, jest semantycznie nieistotne, szczególnie gdy niektóre z tych zmiennych mogą nigdy nie zostać użyte.Teoretycznie nie powinno to robić żadnej różnicy w JavaScript, ponieważ język nie ma zakresu bloków, a jedynie zakres funkcji.
Nie jestem pewien argumentu dotyczącego wydajności, ale Douglas Crockford nadal zaleca, aby
var
instrukcje były pierwszymi instrukcjami w treści funkcji. Cytowanie z konwencji kodu dla języka programowania JavaScript :Myślę, że ma rację, jak widać na poniższym przykładzie. Deklarowanie zmiennych na górze funkcji nie powinno dezorientować czytelników do myślenia, że zmienna
i
jest przechowywana w zakresiefor
bloku pętli:źródło
ecma- / javascript
podbije je w czasie wykonywania. Nazywa się to „podnoszeniem”. Więc nie powinno być żadnej różnicy.let
wpływa na tę odpowiedź?ECMA-/Javascript
Językhoists
każda zmienna, która jest zadeklarowana w dowolnym miejscu na szczycie funkcji. To dlatego, że język ten nie posiadafunction scope
ani nie mająblock scope
jak wiele innych języków jak C.To jest również znane jako
lexical scope
.Jeśli zadeklarujesz coś takiego
To prowadzi
hoisted
do:Więc nie ma to żadnego wpływu na wydajność (Ale popraw mnie, jeśli się tu całkowicie mylę).
O wiele lepszym argumentem za nie deklarowaniem zmiennej gdzieś indziej niż na górze funkcji jest czytelność . Zadeklarowanie zmiennej w obrębie
for-loop
może prowadzić do błędnego założenia, że dostęp do tej zmiennej można uzyskać tylko w ciele pętli, co jest całkowicie błędne . W rzeczywistości można uzyskać dostęp do tej zmiennej w dowolnym miejscu w bieżącym zakresie.źródło
let
wpływa na tę odpowiedź?W przyszłym roku wszystkie przeglądarki będą miały silniki JS, które wstępnie kompilują kod, więc różnica w wydajności (wynikająca z powtarzania tego samego bloku kodu i wykonywania zadania) powinna być znikoma.
Nigdy też nie optymalizuj wydajności, chyba że musisz. Utrzymywanie zmiennych blisko miejsca, w którym są potrzebne, za pierwszym razem utrzymuje kod w czystości. Z drugiej strony ludzie przyzwyczajeni do języków o zakresie blokowym mogą być zdezorientowani.
źródło
Kolejną kwestią, teraz, którą mamy
let
iconst
w ES2015, jest to, że możesz teraz zakresować zmienne specjalnie do bloku pętli. Tak więc, chyba że będziesz potrzebować tej samej zmiennej poza pętlą (lub jeśli każda iteracja zależy od operacji wykonanej na tej zmiennej w poprzedniej iteracji), prawdopodobnie najlepiej jest to zrobić:źródło
Właśnie zrobiłem prosty test w Chrome. Wypróbuj skrzypce w przeglądarce i zobacz wyniki
Rezultat jest taki, że ostatni test zajmuje ~ 8 sekund, a poprzednie 2 to tylko ~ 2 sekundy. Bardzo powtarzalnie i niezależnie od zamówienia.
Udowadnia mi to, że należy zawsze deklarować vars poza pętlą. Ciekawą sprawą jest dla mnie pierwsza, w której deklaruję
i
w instrukcji for (). Ten wydaje się być równie szybki jak drugi test, w którym wstępnie deklaruję indeks.źródło
var
deklaruje jako zmienną globalną i tak być globalnym.JavaScript to język napisany u dołu przez C lub C ++, nie jestem pewien, który to jest. A jednym z jego celów jest oszczędzanie poczucia obsługi pamięci wewnętrznej. Nawet w C lub C ++ nie będziesz musiał się martwić, czy zużyje dużo zasobów, gdy zmienne są deklarowane w pętli. Dlaczego warto się tym martwić w JavaScript?
źródło
Zależy to od tego, co próbujesz osiągnąć ... jeśli
value
założysz , że jest to tylko zmienna tymczasowa w bloku pętli, to o wiele łatwiej jest użyć drugiej postaci. Jest to również bardziej logiczne i pełne słów.źródło
Nie ma znaczenia, jeśli deklarujesz zmienne wewnątrz lub na zewnątrz pętli for. Poniżej znajduje się przykładowy kod do przetestowania.
Wyniki pokazały w moim przypadku
Dziękuję - MyFavs.in
źródło
let
zamiastvar
ia()
wydaje się być nieco wolniejsze (jak 120 vs 115 ms = ~ 6% = nieznaczne IMO)Pytanie tutaj polega na zadeklarowaniu zmiennej var w pętli. Pomyśl tylko, co się stanie, jeśli to zrobisz:
Myślisz, że to prawda? Nie ... ponieważ nie chcesz deklarować zmiennej tyle razy. Kiedy deklarujesz zmienną w pętli, czy nie deklaruje ona tyle razy, ile razy pętla działa? Oczywiście uderzy cię, gdy będziesz w trybie „użyj ścisłego”. Ludzie nie zgadzali się z Crockfordem, nie zastanawiając się nad pierwotnym pytaniem.
Dlatego zawsze dobrze jest deklarować zmienne na górze - 1. Dla czytelności, 2. Nawiązywanie dobrych nawyków.
źródło
Jeśli chodzi o wydajność po uruchomieniu testu w Chrome, Firefox i jsperf w systemie Linux, wydaje się, że istnieje różnica w wydajności między deklaracją zmiennych w pętli i poza nią. Jest to niewielka różnica, ale pogarsza ją także liczba iteracji i liczba deklaracji zmiennych.
Dlatego w celu uzyskania najlepszej wydajności musiałbym zasugerować deklarowanie zmiennych poza pętlą. Lub jeszcze lepiej zadeklaruj swoje zmienne w linii. Patrz przykład.
Zwróć uwagę, jak zmienne „al” i „av” znajdują się w wierszu deklaracji pętli for. Ta wewnętrzna deklaracja zapewniła mi konsekwentnie lepszą wydajność. Nawet ponad deklaracją zmiennych poza pętlą. Znowu różnica w wydajności jest naprawdę niewielka.
https://jsperf.com/outside-inline-for-loop-ase/1
źródło