2014 While
está de vuelta
Solo piensa lógico.
Mira este
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- Necesita crear al menos 2 variables (índice, longitud)
- Necesita verificar si el índice es más pequeño que la longitud
- Necesidad de aumentar el índice
- el
for
bucle tiene 3 parámetros
Ahora dime por qué esto debería ser más rápido que:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- Una variable
- Sin cheques
- el índice disminuye (las máquinas prefieren eso)
while
tiene solo un parámetro
Estaba totalmente confundido cuando Chrome 28 mostró que el ciclo for es más rápido que el tiempo. Esto debe haber ben algún tipo de
"Uh, todos están usando el ciclo for, centrémonos en eso cuando desarrollemos para Chrome"
Pero ahora, en 2014, el ciclo while está de vuelta en Chrome. es 2 veces más rápido, en otros navegadores / más antiguos siempre fue más rápido.
Últimamente hice algunas pruebas nuevas. Ahora, en el mundo real, esos códigos cortos no valen nada y jsperf no puede ejecutar correctamente el ciclo while, porque necesita recrear el array.length, lo que también lleva tiempo.
NO PUEDES obtener la velocidad real de un ciclo while en jsperf.
necesita crear su propia función personalizada y verificar eso con window.performance.now()
Y sí ... no hay forma de que el ciclo while sea simplemente más rápido.
El verdadero problema es en realidad el tiempo de manipulación / renderizado de dom / tiempo de dibujo o como quiera llamarlo.
Por ejemplo, tengo una escena de lienzo donde necesito calcular las coordenadas y las colisiones ... esto se hace entre 10-200 MicroSeconds (no milisegundos). En realidad, se necesitan varios milisegundos para procesar todo.
PERO
Hay otra forma súper eficiente usando el para loop
en algunos casos ... por ejemplo para copiar / clonar una matriz
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
Observe la configuración de los parámetros:
- Igual que en el ciclo while, estoy usando solo una variable
- Es necesario verificar si el índice es mayor que 0;
- Como puede ver, este enfoque es diferente de lo normal para el bucle que todos usan, ya que hago cosas dentro del tercer parámetro y también disminuyo directamente dentro de la matriz.
Dicho esto, esto confirma que máquinas como la ...
escribiendo que estaba pensando en hacerlo un poco más corto y eliminar algunas cosas inútiles y escribí este usando el mismo estilo:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
Incluso si es más corto, parece que usar i
una vez más ralentiza todo. Es 1/5 más lento que el for
bucle anterior y el anterior while
.
Nota: el ;
es muy importante después de la de looo sin{}
Incluso si solo te dijera que jsperf no es la mejor manera de probar scripts ... agregué estos 2 bucles aquí
http://jsperf.com/caching-array-length/40
Y aquí hay otra respuesta sobre el rendimiento en javascript
https://stackoverflow.com/a/21353032/2450730
Esta respuesta es para mostrar formas efectivas de escribir javascript. Entonces, si no puede leer eso, pregunte y recibirá una respuesta o leerá un libro sobre javascript http://www.ecma-international.org/ecma-262/5.1/