¿Cuál es la manera más rápida de resumir un array en JavaScript? Una rápida búsqueda se vuelve más un par de métodos diferentes, pero me gustaría una solución nativa, si es posible. Este se ejecutará en virtud de mono araña.
Pensando muy en el interior de la caja, he estado usando:
var count = 0;
for(var i = 0; i < array.length; i++)
{
count = count + array[i];
}
Estoy seguro de que hay una mejor manera, a continuación, directamente de la iteración.
- La PRUEBA!!! Si usted necesita para ver cuál es la manera más rápida de hacer algo, probar varios, y medir los resultados.
- Bueno, obviamente, sin embargo, yo no estoy en mi «fuera de la caja» pensamiento días.
Usted debería ser capaz de utilizar
reduce
.Fuente
Y con flecha funciones introducido en ES6, es aún más sencillo:
reduce
es una función nativa. En rendimiento orientada código JS, evitando las llamadas de función es casi siempre más rápido,Array.reduce
es muy lento en comparación con otros métodos. jsperf.com/array-reduce-vs-foreach/2Mejoras
Su estructura de bucle podría hacerse más rápido:
Esta forma, se recupera
array.length
vez, en lugar de con cada iteración. La optimización se realiza mediante el almacenamiento en caché el valor.Si usted realmente desea acelerar:
Esto es equivalente a una mientras que la inversa de bucle. Almacena el valor de y es comparado con el 0, por lo tanto más rápido de la iteración.
Para una información más completa lista de comparación, ver a mi JSFiddle.
Nota: matriz.reducir es horrible que hay, pero en la Consola de Firebug es más rápido.
Comparar Las Estructuras
Empecé un JSPerf de una matriz de sumatorias. Rápidamente se construye y no se garantiza que sea completa o precisa, pero eso es lo que editar es para 🙂
for
bucles son casi iguales. He probado y a veces se incremento de manera más rápida que disminuye. Y La Matriz.reducir es terriblemente lento. jsperf.com/array-reduce-vs-foreach/2for (var i = 0, n = array.length; n > i; n--) { sum += array[i]; }
debe ser cambiado afor (var i = 0, n = array.length-1; n >= i; n--) { sum += array[n]; }
. Esto pone en el mismo estadio de béisbol como el otro almacenamiento en caché de los bucles.Mientras que la búsqueda por el mejor método de suma de una matriz, escribí una prueba de rendimiento.
En Chrome, «reducir» parece ser muy superior
Espero que esto ayude a
eval: 5233.000 ms
bucle: 255.000 ms
reducir: 70.000 ms
mientras: 214.000 ms
parseInt
en la reducción de la función? He intentado y he necesitado en mi código.O se puede hacer el mal camino.
😉
La forma más rápida de bucle, de acuerdo a esta prueba es un bucle while en el reverso
Así, este código puede ser el más rápido usted puede conseguir
Array.prototype.sum
agrega una suma método a la clase array… que fácilmente podría hacer que una función auxiliar en su lugar.for(var i=0,n=a.length;i<n;i++){}
debido a que el inicio/parada de la estructura de control.arr
provienen de lasum
método? Debearr
realmentethis
?Para su caso específico, sólo tiene que utilizar el
reduce
método de Matrices:Basado en esta prueba (para-vs-forEach-vs-reducir) y este (bucles)
Puedo decir que:
1# Rápido: bucle for
2# Agregado
Para usted en caso de que usted no necesita esto, sino que se añade una gran cantidad de flexibilidad.
Uso:
Concluyentes métodos
Luego viene
forEach
yreduce
que tienen casi el mismo rendimiento y varía de un navegador a otro, pero tienen el peor desempeño de todos modos.uno de los más simple, más rápido, más reutilizable y flexible es:
class UintArray extends Uint8Array { sum () { FUNCTION_CODE_HERE } }
Lo que acerca de sumar ambas extremidades? Se reduciría a la mitad del tiempo. Así:
1, 2, 3, 4, 5, 6, 7, 8; suma = 0
2, 3, 4, 5, 6, 7; suma = 10
3, 4, 5, 6; suma = 19
4, 5; suma = 28
suma = 37
Un algoritmo puede ser:
Se realiza más rápido cuando la pruebo en el navegador con
performance.now()
.Creo que esta es una mejor manera. ¿Ustedes qué piensan?
O(n/2)
es igual aO(n)
. Por qué? Porque lo que la estimación no es ¿es rápido para una entrada dada, pero ¿cómo hace el cambio de velocidad con el cambio de entrada. Si el doble de la entrada para un O(n) en función lleva el doble de tiempo. Si el doble de la entrada para un O(n/2) función lleva el doble de tiempo. Si el doble de la entrada para un O(n2) se toma cuatro veces más largo.