Eu tento dar uma imagem ampla com esta resposta.
A opinião a seguir entre parênteses era minha opinião, até que recentemente testei o problema:
[[Em termos de linguagens de baixo nível, como C / C ++ , o código é compilado para que o processador tenha um comando de salto condicional especial quando uma variável for zero (ou diferente de zero).
Além disso, se você se preocupa com tanta otimização, pode ir em ++i
vez de i++
, porque ++i
é um comando de processador único, enquanto i++
significa j=i+1, i=j
.]]
Loops muito rápidos podem ser feitos desenrolando-os:
for(i=800000;i>0;--i)
do_it(i);
Pode ser muito mais lento que
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
mas as razões para isso podem ser bastante complicadas (apenas para mencionar, existem os problemas de pré-processamento de comandos do processador e manipulação de cache no jogo).
Em termos de linguagens de alto nível , como o JavaScript solicitado, você pode otimizar as coisas se confiar em bibliotecas, funções internas para loop. Deixe-os decidir como é feito melhor.
Consequentemente, em JavaScript, eu sugeriria usar algo como
array.forEach(function(i) {
do_it(i);
});
Também é menos propenso a erros e os navegadores podem otimizar seu código.
[OBSERVAÇÃO: não apenas os navegadores, mas você também tem um espaço para otimizar com facilidade, basta redefinir a forEach
função (navegador dependente) para que ele use os melhores truques mais recentes! :) @AMK diz que em casos especiais vale a pena usar array.pop
or array.shift
. Se você fizer isso, coloque-o atrás da cortina. O maior exagero é adicionar opções forEach
para selecionar o algoritmo de loop.]
Além disso, também para linguagens de baixo nível, a melhor prática é usar alguma função de biblioteca inteligente para operações complexas em loop, se possível.
Essas bibliotecas também podem colocar coisas (multiencadeadas) nas suas costas e também programadores especializados as mantêm atualizadas.
Fiz um exame mais minucioso e, em C / C ++, mesmo para operações 5e9 = (50.000 x 100.000), não há diferença entre subir e descer se o teste for feito com uma constante como o @alestanis diz. (Os resultados do JsPerf às vezes são inconsistentes, mas geralmente dizem o mesmo: você não pode fazer uma grande diferença.)
Por --i
isso, é uma coisa "chique". Isso só faz você parecer um programador melhor. :)
Por outro lado, ao desenrolar-se nessa situação 5e9, reduzi-me de 12 para 2,5 segundos quando passei 10s e para 2,1 segundos quando passei 20 anos. Foi sem otimização, e a otimização reduziu as coisas a pouco tempo imensurável. :) (O desenrolar pode ser feito da minha maneira acima ou usando i++
, mas isso não traz as coisas adiante no JavaScript.)
Em suma: mantenha i--
/ i++
e ++i
/ i++
diferenças nas entrevistas de emprego, mantenha array.forEach
ou outras funções complexas da biblioteca, quando disponíveis. ;)