2014 While
powraca
Po prostu myśl logicznie.
Spójrz na to
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Musisz utworzyć co najmniej 2 zmienne (indeks, długość)
- Musisz sprawdzić, czy indeks jest mniejszy niż długość
- Musisz zwiększyć indeks
for
pętla 3 parametry
Powiedz mi teraz, dlaczego powinno to być szybsze niż:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Jedna zmienna
- Brak czeków
- indeks jest zmniejszony (maszyny wolą)
while
ma tylko jeden parametr
Byłem całkowicie zdezorientowany, gdy Chrome 28 pokazał, że pętla for jest szybsza niż w tym czasie. To musi mieć ben
„Uh, wszyscy używają pętli for, skupmy się na tym podczas programowania dla chrome”.
Ale teraz, w 2014 r., Pętla while wraca do Chrome. jest 2 razy szybszy, w innych / starszych przeglądarkach zawsze był szybszy.
Ostatnio zrobiłem kilka nowych testów. Teraz, w środowisku rzeczywistym, te krótkie kody są nic nie warte, a jsperf nie może właściwie wykonać poprawnie pętli while, ponieważ musi odtworzyć długość tablicy. Zajmuje to również trochę czasu.
nie możesz uzyskać rzeczywistej prędkości pętli while na jsperf.
musisz stworzyć własną funkcję niestandardową i sprawdzić to za pomocą window.performance.now()
I tak ... nie ma mowy, żeby pętla while była po prostu szybsza.
Prawdziwym problemem jest tak naprawdę manipulacja domem / czas renderowania / czas rysowania lub jakkolwiek chcesz to nazwać.
Na przykład mam scenę płótna, w której muszę obliczyć współrzędne i kolizje ... odbywa się to między 10-200 mikrosekund (nie w milisekundach). tak naprawdę renderowanie wszystkiego zajmuje kilka milisekund. Tak samo jak w DOM.
ALE
Istnieje inny bardzo wydajny sposób, loop
w niektórych przypadkach użycie for ... na przykład do kopiowania / klonowania tablicy
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Zwróć uwagę na ustawienie parametrów:
- Tak samo, jak w pętli while, używam tylko jednej zmiennej
- Musisz sprawdzić, czy indeks jest większy niż 0;
- Jak widać, to podejście jest inne niż normalne dla pętli, której wszyscy używają, ponieważ robię rzeczy wewnątrz trzeciego parametru i również zmniejszam bezpośrednio w tablicy.
Powiedział to, że potwierdza to, że maszyny takie jak -
pisząc, że chciałem zrobić to trochę krócej i usunąć trochę niepotrzebnych rzeczy i napisałem ten w tym samym stylu:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Nawet jeśli jest krótszy, wygląda na to, że użycie jeszcze i
jednego czasu wszystko spowalnia. Jest o 1/5 wolniejszy niż poprzednia for
i while
pierwsza pętla .
Uwaga:;
jest bardzo ważne po za looo bez{}
Nawet jeśli właśnie powiedziałem, że jsperf nie jest najlepszym sposobem testowania skryptów .. dodałem tutaj 2 pętle
http://jsperf.com/caching-array-length/40
A oto kolejna odpowiedź na temat wydajności w javascript
https://stackoverflow.com/a/21353032/2450730
Ta odpowiedź ma pokazać skuteczne sposoby pisania javascript. Więc jeśli nie możesz tego przeczytać, zapytaj, a otrzymasz odpowiedź lub książkę o javascript http://www.ecma-international.org/ecma-262/5.1/