Redux consumo de memoria [cerrado]

23

El marco de Redux favorece el paradigma de estado puro / función inmutable, que promueve la creación de un nuevo estado a partir del estado anterior en términos de la acción actual. La aplicabilidad de este paradigma es indudable.

Una de las principales preocupaciones mías es que, dado que los reductores de Redux devuelven con entusiasmo nuevos estados nuevos de estados anteriores para cada acción invocada, el consumo masivo de memoria (que no debe confundirse con las pérdidas de memoria) se convertiría en una ocurrencia común en muchas aplicaciones del mundo real . Cuando se considera que las aplicaciones Javascript normalmente se ejecutan en un navegador en los dispositivos de un usuario promedio que también podrían estar ejecutando varias otras aplicaciones específicas del dispositivo y varias pestañas y ventanas más del navegador, la necesidad de conservar memoria se hace cada vez más evidente.

¿Alguien ha comparado realmente el consumo de memoria de una aplicación Redux con la arquitectura tradicional Flux? Si es así, ¿podrían compartir sus hallazgos?

000
fuente
44
Estoy votando para cerrar esta pregunta como fuera de tema porque está pidiendo información de perfiles de memoria arbitraria.
¿Lo has perfilado?
¿Por qué debería perfilarlo? Para confirmar lo obvio? ¿No es de sentido común que generar un objeto similar una y otra vez incurre en una sobrecarga importante en términos de uso de memoria? La respuesta de @ Dan proporciona una manera de minimizar esa sobrecarga y esa es la mejor respuesta hasta ahora.
000

Respuestas:

30

Esta es una preocupación valida. Si bien no he medido el uso de memoria de las aplicaciones de Redux, creo que antes de comprometerse a usar Redux (o cualquier otro marco para el caso) debe crear pruebas de estrés que emulen las cantidades de datos, la frecuencia de cambio y la intensidad de cálculo de la aplicación van a construir Utilice estas pruebas de resistencia antes de tomar decisiones tecnológicas sobre si adoptar la inmutabilidad funciona en su caso particular.

Tenga en cuenta que a veces las personas se confunden con Redux y suponen que en cada acción, el árbol de estado debe clonarse profundamente. Este absolutamente no es el caso. Solo las partes que cambiaron necesitan cambiar sus referencias. Por ejemplo, si una acción provoca un cambio en un elemento de una matriz, de hecho, ese elemento y la matriz deberán copiarse, sin embargo , todos los demás elementos de la matriz mantendrán sus identidades. Debido a que la mayoría de las veces las acciones son muy específicas y afectan algunas claves de estado, y debido a que Redux fomenta la normalización de datos para que las estructuras de datos no estén profundamente anidadas, este es un problema mucho menor para las aplicaciones web típicas de lo que uno podría imaginar.

También querrá explorar el uso de bibliotecas como Immutable.js que implementan listas y mapas inmutables de manera eficiente mediante el uso interno estructural. De esta manera, cambiar algunos elementos en una lista no implica tanta copia porque internamente la mayor parte de la memoria se comparte entre diferentes versiones de la estructura de datos.

Pero al final, la única forma de saberlo es escribir las pruebas de estrés que emulan de cerca el uso previsto de su aplicación y medir la eficiencia por usted mismo.

Dan
fuente
10
No se apresure a saltar a Immutable.js. Se está convirtiendo en un problema de memoria grave en nuestro caso. Immutable.js toma sus objetos simples (presumiblemente) limpios y los instancia en monstruos hambrientos de memoria. Eche un vistazo a este ejemplo: jsfiddle.net/sn70x2p6 Después de la carga, la pestaña ocupa 61,000 KB de memoria. Después de hacer un millón de objetos simples, son 211,000 KB. Loca. Ahora haga clic en "hacer inmutable" y vea qué sucede. Salta a más de 1 GB de uso de memoria. Su experiencia puede diferir, pero no mucho.
Olav Kokovkin