Contexto: Estoy creando un pequeño sitio que lee un feed de rss y actualiza / verifica el feed en segundo plano. Tengo una matriz para almacenar datos para mostrar y otra que almacena ID de registros que se han mostrado.
Pregunta: ¿Cuántos elementos puede contener una matriz en Javascript antes de que las cosas comiencen a ponerse lentas o lentas? No estoy ordenando la matriz, pero estoy usando la función inArray de jQuery para hacer una comparación.
El sitio web seguirá funcionando y actualizándose y es poco probable que el navegador se reinicie / actualice con tanta frecuencia.
Si debería pensar en borrar algunos registros de la matriz, ¿cuál es la mejor manera de eliminar algunos registros después de un límite, como 100 elementos?
javascript
arrays
añadido
fuente
fuente
Respuestas:
La longitud máxima hasta que "se vuelve lento" depende totalmente de su máquina de destino y su código real, por lo que deberá probar en esa (esas) plataforma (s) para ver qué es aceptable.
Sin embargo, la longitud máxima de una matriz de acuerdo con la especificación ECMA-262 5th Edition está limitada por un entero de 32 bits sin signo debido a la operación abstracta ToUint32 , por lo que la matriz más larga posible podría tener 2 32 -1 = 4,294,967,295 = 4,29 mil millones de elementos .
fuente
No es necesario recortar la matriz, simplemente diríjala como un búfer circular (índice% maxlen). Esto asegurará que nunca sobrepase el límite (implementar un búfer circular significa que una vez que llega al final, vuelve al principio; no es posible sobrepasar el final de la matriz).
Por ejemplo:
fuente
Puede probar algo como esto para probar y recortar la longitud:
http://jsfiddle.net/orolo/wJDXL/
fuente
Como dijo @maerics, su máquina de destino y su navegador determinarán el rendimiento.
Pero para algunos números del mundo real, en mi Chromebook empresarial 2017, ejecutando la operación:
x=5e4
toma 16 ms, lo suficientemente bueno para 60 fpsx=4e6
tarda 250 ms, lo cual se nota pero no es gran cosax=3e7
tarda 1300 ms, lo cual es bastante malox=4e7
toma 11000ms y asigna 2.5GB extra de memoriaEntonces, alrededor de 30 millones de elementos es un límite superior estricto, porque la máquina virtual javascript cae por un precipicio a 40 millones de elementos y probablemente bloqueará el proceso.
fuente
He construido un marco de rendimiento que manipula y grafica millones de conjuntos de datos, e incluso entonces, la latencia de cálculo de JavaScript era del orden de decenas de milisegundos. A menos que esté preocupado por superar el límite de tamaño de la matriz, no creo que tenga mucho de qué preocuparse.
fuente
Dependerá mucho del navegador. 100 elementos no suena como un gran número; supongo que podrías ir mucho más alto que eso. Miles no deberían ser un problema. Lo que puede ser un problema es el consumo total de memoria.
fuente
Sin vergüenza, he extraído algunos conjuntos de datos bastante grandes en la memoria, y aunque se volvió lento, tomó tal vez 15 Mo de datos hacia arriba con cálculos bastante intensos en el conjunto de datos. Dudo que tenga problemas con la memoria a menos que tenga cálculos intensos en los datos y muchas filas. La elaboración de perfiles y la evaluación comparativa con diferentes conjuntos de resultados simulados será su mejor opción para evaluar el rendimiento.
fuente