2012-09-14 11 views
7

Una domanda veloce solo. Ho creato il benchmark (link sotto), e per me almeno (con chrome 18.0.1025), leggere i valori dalla parte anteriore di un array usando array.shift() ogni volta sembra notevolmente più veloce della lettura dei valori usando un while/for loop e accedendoli per indice.Javascript: Perché questo benchmark mostra array.shift() per essere molto più veloce dell'array [i] durante la lettura dei valori da un array?

Sono sicuro che questo non può essere corretto, in quanto shift() ha molto più lavoro da fare, ma allo stesso tempo non riesco a vedere cosa avrei potuto fare di sbagliato per spiegare questa differenza piuttosto estrema?

http://jsperf.com/some-array-reading-comparisons

Grazie per la lettura, James

risposta

7

si sta configurando la matrice sola volta per ogni prova, e quindi solo la prima iterazione del test shift ha tutti i dati con cui lavorare. Le iterazioni successive hanno una matrice vuota lasciata dalla prima iterazione e terminano immediatamente.

Here is the fixed test suite, dove gli algoritmi mutanti lavorare su una copia dei dati. L'algoritmo shift è prevedibilmente l'ultimo in termini di prestazioni.

+1

Per correttezza è necessario copiare la matrice per quelli che utilizzano anche l'indice. – kennytm

+0

Vero. La suite di test è stata aggiornata, 'shift' è ancora in ordine per ultimo. – lanzz

+0

Grazie, quello era il mio primo sospetto. Avevo l'impressione che il codice di installazione fosse eseguito prima di ogni iterazione, piuttosto che appena prima di ogni test :) – jsdw