Creé un mapa inmutable y actualmente lo estoy usando con redux y tengo algunas preguntas generales sobre la inmutabilidad. Por lo que entiendo, al pasar accesorios a un componente, los accesorios hacen un renderizado inicial. Si se cambia el valor de la propiedad, no se vuelve a procesar, ya que Javascript está realizando una operación === para verificar la dirección de la memoria en lugar de verificar los valores de esa memoria. Lo que hace la inmutabilidad es cambiar la dirección dentro de la memoria para activar la nueva representación. Mi preocupación en este momento es: ¿no estamos desperdiciando recursos de memoria si planeo no usar nunca el mapa que está almacenado en la dirección anterior en la memoria? Además, si esto se hace de forma repetitiva con el usuario haciendo clic en un mapa inmutable expandiendo su uso de memoria cada vez más, ¿no podría esto causar problemas de rendimiento? ¿Hay alguna manera de eliminar la dirección anterior en la memoria después de crear la nueva? Aquí hay parte de mi código Redux si pudiera darme consejos sobre si estoy haciendo algo mal:
import {Map} from 'immutable' const likesAndSaved = new Map() function likesAndSavedReducer(state = likesAndSaved, action) { switch (action.type) { case 'updateObj': return state.set(action.payloadId, action.payloadData) default: return state; } }Los objetos sin referencia son eliminados de la memoria por el recolector de elementos no utilizados. Eso también se aplica al "valor anterior" en un mapa Immutable.js.
Para citar la página de introducción de immutable-js.com :
Estas estructuras de datos son muy eficientes en las máquinas virtuales de JavaScript modernas mediante el uso compartido estructural a través de intentos de mapas hash e intentos de vectores , como lo popularizaron Clojure y Scala, lo que minimiza la necesidad de copiar o almacenar en caché los datos.
Cuando crea un mapa con 1000 entradas y luego cambia una sola, este tipo de estructura de datos no tiene que copiar todas estas referencias y/o valores. En cambio, solo tiene que extender una pequeña parte del trie. Entonces, incluso si mantuviera una referencia tanto al estado antiguo como al nuevo, el aumento en el uso de la memoria sería mínimo. Cuando borra la referencia a un estado (por ejemplo, el anterior), la VM de javascript puede borrar esa memoria cuando lo desee.
Es posible que incluso gane rendimiento, ya que la verificación superficial de las propiedades con === ahora es suficiente para determinar los cambios. Ahora puede usar PureComponent de forma segura. No es necesario analizar en profundidad los objetos para determinar si los datos realmente han cambiado.
Descargo de responsabilidad: formo parte del equipo de mantenimiento de Immutable.js y también lo uso mucho en aplicaciones grandes.