2010-04-30 11 views
12

CzyJavascript dla wydajności pętli

for (var i=0, cols=columns.length; i<cols; i++) { ... } 

bardziej wydajny niż

for (var i=0; i<columns.length; i++) { ... } 

?

W drugim wariancie, czy columns.length jest obliczany za każdym razem, gdy sprawdzany jest warunek i<columns.length?

+2

OSTRZEŻENIE: Upewnij się, że cols jest zadeklarowane z ** var ** i ** wewnątrz funkcji **. Jeśli obie te rzeczy nie są takie, JavaScript może traktować je jako zmienną globalną (a tym samym spowalnia dostęp). Przeglądarki oparte na WebKit ignorują var zakresu globalnego, nawet jeśli dana zmienna jest w konflikcie ze zmienną globalną (na przykład 'status'). –

+2

@Joey Adams: 'var i = 0, cols = columns.length' zadeklaruje cols jako var, prawda? – StriplingWarrior

Odpowiedz

8

Każde wyrażenie znajdujące się w drugiej części a zostanie ocenione raz na pętlę.

Tak więc, tutaj, przy Twojej drugiej propozycji, tak, columns.length będzie obliczane za każdym razem, gdy warunek zostanie sprawdzony - co sprawi, że pierwsza propozycja będzie szybsza od drugiej.


(To prawda, w wielu innych językach, btw)

+1

Nie dotyczy to tego, czy inteligentne środowisko wykonawcze JS może je zoptymalizować. –

+3

Próbowałem go w Chrome i Firefoksie (obie obecnie korzystają z dynamicznej kompilacji), a w obu przypadkach buforowanie 'columns.length' ze zmienną lokalną jest szybsze niż użycie' kolumn.długość' w pętli. –

+1

@Joey Adams: Po prostu z ciekawości, ile to jest szybciej? Czy w większości przypadków można to nazwać przedwczesną optymalizacją? – StriplingWarrior

5

Micro optymalizacje, takie jak ten nie robią ogromny sens w języku jak JavaScript, chyba że zostały przetestowane i stwierdzono działanie pętli być problemem .

Jednak w każdej iteracji należy przeanalizować columns.length, ponieważ liczba kolumn może ulec zmianie podczas iteracji pętli. Dlatego przechowywanie limitu pętli może dać nieco lepszą wydajność (ale zobacz mój pierwszy punkt).

0

Tak, to prawda. Uzyskanie dostępu do właściwości length powoduje niepotrzebny czas (chyba że długość tablicy może się zmienić podczas iteracji).

Oto jak ja pętli tablic: http://gist.github.com/339735

1

Należy zauważyć, że większość z tych pętli wymaga dodatkowego oświadczenia w pętli, aby faktycznie odzyskać i'th element z tablicy. Możesz tego uniknąć i uzyskać bardzo szybką pętlę z następującym wariantem, który wykorzystuje fakt, że JavaScript po prostu zwraca undefined (który zwraca wartość false), jeśli uzyskujesz dostęp do tablicy z indeksem poza granicami (zamiast zgłaszać błąd):

for (var i = 0, kol; col = kolumny [i]; i ++) {...}

Oczywiście to nie działa, jeśli jesteś iteracji poprzez tablicę zawierającą elementy, które mogą być fałszywe.

Powiązane problemy