2012-03-30 21 views
11

Nel sito Web this è disponibile un elenco di variazioni del ciclo. Riesco a capire l'utilizzo del ciclo for(var i=0, len=arr.length; i<len ;i++) (dove arr è un array), dal momento che lo arr.length non viene calcolato in ogni passaggio sembra essere un guadagno marginale delle prestazioni. Tuttavia quali sono i vantaggi dell'utilizzo delle altre varianti? Ad esempio, come loopPer loop Variazioni in javascript

  1. for (var i=arr.length; i--;)
  2. for (var i=0, each; each = arr[i]; i++)

Sussistono cambiamenti notevoli nelle prestazioni utilizzando diverse variazioni ciclo? Generalmente uso for(var i=0, len=arr.length; i<len ;i++) anche per array molto grandi. Quindi voglio solo sapere se c'è qualcosa che mi manca qui.

+0

Il ciclo di "decremento" è molto più veloce in js. per quanto riguarda l'ultimo non lo userei, dal momento che in js false == 0 == "". – mpm

+0

possibile duplicato di [JavaScript - I loop sono molto più veloci al contrario ...?] (Http://stackoverflow.com/questions/1340589/javascript-are-loops-really-faster-in-reverse) – Matt

+1

@camus Il secondo uno può essere utile durante il looping ad es. una raccolta di elementi DOM. –

risposta

6

È ampiamente considerato che una rovesciata ciclo while

var loop = arr.length; 
while(loop--) { 
} 

è il più veloce riccio del tipo disponibile in lingue C-like (questo vale anche per ECMAscript per un bel po ', ma penso che tutti up-to i motori di data sono abbastanza costosi anche su circuiti standard oggi). (jsperf)

tuo 'varianti' sono in realtà variazioni, ma l'uso solo diversa del conditional dichiarazione all'interno del for-loop (che, in realtà lo rende un variation..doh!). Come

1) for (var i=arr.length; i--;)

utilizza solo la parte condizionale dal for-loop a fare entrambe le cose, l'iterazione e controllando se i ha un valore truthy. Non appenadiventa 0, il ciclo terminerà.

2) for (var i=0, each; each = arr[i]; i++)

Qui otteniamo l'elemento da ciascuna iterazione, così possiamo accedere direttamente che all'interno del corpo del ciclo. Questo è comunemente usato quando sei stanco di ripetere sempre arr[ n ].

Si sta facendo bene nella cache della proprietà .length prima del ciclo. Come hai giustamente menzionato, è più veloce perché non dobbiamo accedere a quella proprietà in ogni iterazione. Oltre a ciò, è anche richiesto a volte nello scripting DOM, quando si tratta di "strutture live" come HTMLCollections.

2

Il punto è quando si sta decrementando l'iteratore, si sta effettivamente paragonandolo a 0 piuttosto che la lunghezza, che è più veloce in quanto il "<, < =,>,> =" operatori richiedono controlli di tipo sia su lati sinistro e destro dell'operatore per determinare quale comportamento di confronto dovrebbe essere usato.

il ciclo più veloce è: (Se non vi interessa circa l'ordine ovviamente)

var i = arr.length 
while(i--) 
{ 
} 

Se non interessa l'ordine, il metodo che si sta utilizzando è bene.

1

Si tratta di un uso scarso di a per ogni ciclo perché non riuscirà su valori falsy, rompendo il ciclo.

for (var i=0, each; each = arr[i]; i++) 

Anche io non userei questo ciclo (anche difficile potrebbe essere più veloce ...)

for (var i=arr.length; i--;) 

Sembra confuso ed è meno leggibile, si potrebbe anche scrivere come inversione ciclo while poi.

2

Secondo jsperf il tipo più veloce di loop in JavaScript è

var arr = new Array(10); 
var i = 0; 
while (i < arr.length) { 
arr[i]; 
i++; 
}; 

proprio davanti (il mio ciclo di default)

var arr = new Array(10); 
for (var i = 0; i < arr.length; ++i) { 
arr[i]; 
}; 

Con questo essere il più lento:

var arr = new Array(10); 
arr.forEach(function(x) { 
x; 
}); 

almeno su Chrome 17 su OSX 10.7.3. Quindi sembra che il ciclo "predefinito" stia bene dopo tutto !!!

+0

Questi test jsperf sono molto utili. Grazie! –