Intento dar una imagen amplia con esta respuesta.
Lo siguiente entre paréntesis fue mi creencia hasta que recientemente probé el problema:
[[En términos de lenguajes de bajo nivel como C / C ++ , el código se compila para que el procesador tenga un comando de salto condicional especial cuando una variable es cero (o no cero).
Además, si te importa esta optimización, puedes ir en ++i
lugar de hacerlo i++
, porque ++i
es un comando de procesador único, mientras que i++
significa j=i+1, i=j
.]]
Se pueden hacer bucles realmente rápidos desenrollando:
for(i=800000;i>0;--i)
do_it(i);
Puede ser mucho más lento que
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
pero las razones para esto pueden ser bastante complicadas (solo por mencionar, hay problemas de preprocesamiento de comandos de procesador y manejo de caché en el juego).
En términos de lenguajes de alto nivel , como JavaScript, tal como lo solicitó, puede optimizar las cosas si confía en bibliotecas, funciones integradas para bucles. Déjelos decidir cómo se hace mejor.
En consecuencia, en JavaScript, sugeriría usar algo como
array.forEach(function(i) {
do_it(i);
});
También es menos propenso a errores y los navegadores tienen la oportunidad de optimizar su código.
[OBSERVACIÓN: no solo los navegadores, sino que también tiene un espacio para optimizar fácilmente, simplemente redefina la forEach
función (dependiendo del navegador) para que utilice el mejor truco más reciente. :) @AMK dice que en casos especiales vale la pena usar array.pop
o array.shift
. Si haces eso, ponlo detrás de la cortina. La mayor exageración es agregar opciones forEach
para seleccionar el algoritmo de bucle.]
Además, también para los idiomas de bajo nivel, la mejor práctica es utilizar alguna función de biblioteca inteligente para operaciones complejas en bucle si es posible.
Esas bibliotecas también pueden poner cosas (multiproceso) a sus espaldas y también los programadores especializados las mantienen actualizadas.
Hice un poco más de escrutinio y resultó que en C / C ++, incluso para las operaciones 5e9 = (50,000x100,000), no hay diferencia entre subir y bajar si la prueba se realiza contra una constante como dice @alestanis. (Los resultados de JsPerf a veces son inconsistentes, pero en general dicen lo mismo: no se puede hacer una gran diferencia).
Por lo tanto, --i
resulta ser algo "elegante". Solo te hace ver como un mejor programador. :)
Por otro lado, para desenrollarme en esta situación de 5e9, me ha bajado de 12 segundos a 2.5 segundos cuando pasé 10 segundos, y a 2.1 segundos cuando pasé 20 años. Fue sin optimización, y la optimización ha reducido las cosas a poco tiempo inconmensurable. :) (El desenrollado se puede hacer en mi forma anterior o usando i++
, pero eso no adelanta las cosas en JavaScript).
En general: mantenga i--
/ i++
y ++i
/ i++
diferencias en las entrevistas de trabajo, cumpla array.forEach
u otras funciones complejas de la biblioteca cuando estén disponibles. ;)