Il 2014 Whileè tornato
Basta pensare logico.
Guarda questo
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- È necessario creare almeno 2 variabili (indice, lunghezza)
- È necessario verificare se l'indice è inferiore alla lunghezza
- È necessario aumentare l'indice
- il
forloop ha 3 parametri
Ora dimmi perché questo dovrebbe essere più veloce di:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Una variabile
- Nessun controllo
- l'indice è diminuito (le macchine preferiscono quello)
while ha solo un parametro
Ero totalmente confuso quando Chrome 28 ha mostrato che il ciclo for è più veloce del tempo. Questo deve avere ben una sorta di
"Uh, tutti usano il ciclo for, concentriamoci su quello quando sviluppiamo per Chrome."
Ma ora, nel 2014 il ciclo while è tornato su Chrome. è 2 volte più veloce, su altri / vecchi browser era sempre più veloce.
Ultimamente ho fatto alcuni nuovi test. Ora nel mondo reale quei codici brevi non valgono nulla e jsperf non può effettivamente eseguire correttamente il ciclo while, perché deve ricreare l'array.length che richiede anche tempo.
non è possibile ottenere la velocità effettiva di un ciclo while su jsperf.
devi creare la tua funzione personalizzata e verificarla con window.performance.now()
E sì ... non c'è modo che il ciclo while sia semplicemente più veloce.
Il vero problema è in realtà la manipolazione dom / tempo di rendering / tempo di disegno o comunque tu voglia chiamarlo.
Ad esempio ho una scena su tela in cui ho bisogno di calcolare le coordinate e le collisioni ... questo avviene tra 10-200 MicroSecondi (non millisecondi). in realtà ci vogliono vari millisecondi per eseguire il rendering di tutto. Stesso come in DOM.
MA
C'è un altro modo super performante che usa il per loopin alcuni casi ... per esempio per copiare / clonare un array
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Si noti l'impostazione dei parametri:
- Come nel ciclo while sto usando solo una variabile
- È necessario verificare se l'indice è maggiore di 0;
- Come puoi vedere, questo approccio è diverso rispetto al normale per il ciclo che tutti usano, poiché faccio cose all'interno del terzo parametro e diminuisco anche direttamente all'interno dell'array.
Detto questo, ciò conferma che le macchine come il -
scrivendo che stavo pensando di renderlo un po 'più corto e rimuovere alcune cose inutili e ho scritto questo usando lo stesso stile:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Anche se è più corto, sembra che usare ancora iuna volta rallenta tutto. È 1/5 più lento del forloop precedente e di quello precedente while.
Nota: il ;è molto importante dopo la per Looo senza{}
Anche se ti ho appena detto che jsperf non è il modo migliore per testare gli script .. ho aggiunto qui 2 loop
http://jsperf.com/caching-array-length/40
Ed ecco un'altra risposta sulle prestazioni in javascript
https://stackoverflow.com/a/21353032/2450730
Questa risposta è mostrare modi performanti di scrivere javascript. Quindi se non riesci a leggerlo, chiedi e otterrai una risposta o leggi un libro su javascript http://www.ecma-international.org/ecma-262/5.1/