Cerco di dare un quadro generale con questa risposta.
I seguenti pensieri tra parentesi erano la mia convinzione fino a quando non ho appena testato il problema di recente:
[[In termini di linguaggi di basso livello come C / C ++ , il codice viene compilato in modo che il processore disponga di un comando di salto condizionale speciale quando una variabile è zero (o diverso da zero).
Inoltre, se ti interessa questa ottimizzazione, potresti andare ++i
invece i++
, perché ++i
è un comando a processore singolo mentre i++
significa j=i+1, i=j
.]]
I cicli veramente veloci possono essere fatti srotolandoli:
for(i=800000;i>0;--i)
do_it(i);
Può essere molto più lento di
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
ma le ragioni possono essere piuttosto complicate (solo per citare, ci sono i problemi di preelaborazione dei comandi del processore e gestione della cache nel gioco).
In termini di lingue di alto livello , come JavaScript come richiesto, è possibile ottimizzare le cose se si fa affidamento su librerie, funzioni integrate per il looping. Lascia che decidano come è meglio farlo.
Di conseguenza, in JavaScript, suggerirei di usare qualcosa di simile
array.forEach(function(i) {
do_it(i);
});
È anche meno soggetto a errori e i browser hanno la possibilità di ottimizzare il codice.
[NOTA: non solo i browser, ma anche tu hai uno spazio per ottimizzare facilmente, basta ridefinire la forEach
funzione (il browser dipende) in modo che utilizzi i migliori trucchi più recenti! :) @AMK dice che in casi speciali vale la pena usare array.pop
o array.shift
. Se lo fai, mettilo dietro la tenda. Il massimo è aggiungere opzioni forEach
per selezionare l'algoritmo di loop.]
Inoltre, anche per linguaggi di basso livello, la migliore pratica è quella di utilizzare alcune funzioni di libreria intelligenti per operazioni complesse, se possibile.
Quelle librerie possono anche mettere le cose (multi-thread) dietro la schiena e anche programmatori specializzati le tengono aggiornate.
Ho fatto un po 'più di controllo e si scopre che in C / C ++, anche per operazioni 5e9 = (50.000x100.000), non c'è differenza tra andare su e giù se il test viene eseguito su una costante come dice @alestanis. (I risultati di JsPerf a volte sono incoerenti, ma in linea di massima dicono lo stesso: non si può fare una grande differenza.)
Quindi --i
sembra piuttosto una cosa "elegante". Ti fa solo sembrare un programmatore migliore. :)
D'altra parte, srotolarsi in questa situazione 5e9, mi ha portato da 12 secondi a 2,5 secondi quando sono passato di 10 secondi e a 2,1 secondi quando sono passato di 20 secondi. Era senza ottimizzazione e l'ottimizzazione ha portato le cose a un tempo poco misurabile. :) (Lo srotolamento può essere fatto nel modo sopra o usando i++
, ma ciò non porta avanti le cose in JavaScript.)
Tutto sommato: mantenere i--
/ i++
e ++i
/ i++
differenze nelle interviste di lavoro, attenersi array.forEach
o altre funzioni di libreria complesse quando disponibili. ;)