2014 While
está de volta
Apenas pense lógico.
Veja isso
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Precisa criar pelo menos 2 variáveis (índice, comprimento)
- Precisa verificar se o índice é menor que o comprimento
- Precisa aumentar o índice
- o
for
loop tem 3 parâmetros
Agora me diga por que isso deve ser mais rápido do que:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Uma variável
- Sem verificações
- o índice diminui (as máquinas preferem isso)
while
tem apenas um parâmetro
Fiquei totalmente confuso quando o Chrome 28 mostrou que o loop for é mais rápido do que o tempo. Isso deve ter ben algum tipo de
"Todo mundo está usando o loop for, vamos nos concentrar nisso ao desenvolver para o chrome".
Mas agora, em 2014, o loop while está de volta no chrome. é 2 vezes mais rápido, em outros navegadores / antigos sempre foi mais rápido.
Ultimamente eu fiz alguns novos testes. Agora, no ambiente real, esses códigos curtos não valem nada e o jsperf não pode realmente executar corretamente o loop while, porque precisa recriar o array.length que também leva tempo.
você não pode obter a velocidade real de um loop while no jsperf.
você precisa criar sua própria função personalizada e verificar com window.performance.now()
E sim ... não há como o loop while ser simplesmente mais rápido.
O verdadeiro problema é, na verdade, o tempo de manipulação / renderização / tempo de desenho ou como você quiser chamá-lo.
Por exemplo, eu tenho uma cena de tela em que preciso calcular as coordenadas e colisões ... isso é feito entre 10-200 MicroSegundos (não milissegundos). na verdade, leva vários milissegundos para renderizar tudo.
MAS
Existe outra maneira de super desempenho usando o for loop
em alguns casos ... por exemplo, para copiar / clonar uma matriz
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Observe a configuração dos parâmetros:
- Igual ao loop while, estou usando apenas uma variável
- Precisa verificar se o índice é maior que 0;
- Como você pode ver, essa abordagem é diferente do loop for normal que todo mundo usa, como eu faço coisas dentro do terceiro parâmetro e também diminuo diretamente dentro da matriz.
Disse que isso confirma que máquinas como a -
escrevendo que eu estava pensando em torná-lo um pouco mais curto e remover algumas coisas inúteis e escrevi este usando o mesmo estilo:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Mesmo que seja mais curto, parece que usar i
mais uma vez torna tudo mais lento. É 1/5 mais lento que o for
loop anterior e o anterior while
.
Nota: o ;
é muito importante depois do looo sem{}
Mesmo se eu apenas lhe disser que o jsperf não é a melhor maneira de testar scripts ... eu adicionei esses 2 loops aqui
http://jsperf.com/caching-array-length/40
E aqui está outra resposta sobre o desempenho em javascript
https://stackoverflow.com/a/21353032/2450730
Esta resposta é para mostrar maneiras eficientes de escrever javascript. Portanto, se você não conseguir ler isso, pergunte e você receberá uma resposta ou lerá um livro sobre javascript http://www.ecma-international.org/ecma-262/5.1/