Consumo di memoria Redux [chiuso]


23

Il framework Redux favorisce il paradigma dello stato immutabile / funzione pura, che promuove la creazione di un nuovo stato dallo stato precedente in termini di azione corrente. L'applicabilità di questo paradigma è indubitabile.

Una delle mie maggiori preoccupazioni è che, dato che i riduttori Redux restituiscono con entusiasmo nuovi stati nuovi dagli stati precedenti per ogni singola azione invocata, una massiccia perdita di memoria (da non confondere con le perdite di memoria) diventerebbe un evento comune in molte applicazioni del mondo reale . Se si considera che le applicazioni JavaScript normalmente vengono eseguite in un browser in dispositivi di un utente medio che potrebbero anche eseguire diverse altre applicazioni specifiche del dispositivo e molte più schede e finestre del browser, la necessità di conservare la memoria diventa sempre più evidente.

Qualcuno ha effettivamente confrontato il consumo di memoria di un'applicazione Redux con la tradizionale architettura Flux? In tal caso, potrebbero condividere le loro scoperte?


4
Sto votando per chiudere questa domanda come fuori tema perché richiede informazioni arbitrarie sul profilo della memoria.

L' hai profilato?

Perché dovrei profilarlo? Per confermare l'ovvio? Non è logico che la generazione ripetuta di un oggetto simile comporti un grave sovraccarico in termini di utilizzo della memoria? La risposta di @ Dan fornisce un modo per ridurre al minimo quell'overhead e questa è la migliore risposta finora.
000,

Risposte:


30

Questa è una preoccupazione valida. Anche se non ho misurato l'utilizzo della memoria delle applicazioni Redux, penso che prima di impegnarmi a utilizzare Redux (o qualsiasi altro framework in tal senso) è necessario creare prove di stress che emulino la quantità di dati, la frequenza di modifica e l'intensità di calcolo dell'applicazione stanno per costruire. Usa questi stress test prima di prendere decisioni tecnologiche sull'adozione dell'immutabilità nel tuo caso particolare.

Nota che a volte le persone si confondono su Redux e presumono che su ogni azione, l'albero di stato debba essere clonato in profondità. Questo non è assolutamente il caso. Solo le parti che sono cambiate devono cambiare i loro riferimenti. Ad esempio, se un'azione provoca una modifica a un elemento in un array, in effetti, quell'elemento e l'array dovranno essere copiati, tuttavia , tutti gli altri elementi dell'array manterranno le loro identità. Poiché la maggior parte delle volte le azioni sono molto mirate e influiscono su alcune chiavi di stato, e poiché Redux incoraggia la normalizzazione dei dati in modo che le strutture dei dati non siano nidificate in profondità, questo è un problema molto meno per le webapp tipiche di quanto si possa immaginare.

Ti consigliamo di esplorare anche utilizzando librerie come Immutable.js che implementano elenchi e mappe immutabili in modo efficiente utilizzando la condivisione strutturale internamente. In questo modo, la modifica di alcuni elementi in un elenco non comporta molta copia poiché internamente la maggior parte della memoria viene condivisa tra diverse versioni della struttura dei dati.

Ma alla fine, l'unico modo per dirlo è scrivere gli stress test che emulano da vicino l'uso previsto della tua app e misurare l'efficienza per te stesso.


10
Non essere così veloce per passare a Immutable.js. Nel nostro caso sta diventando un serio problema di memoria. Immutable.js prende i tuoi oggetti (presumibilmente) puliti e li crea in mostri affamati di memoria. Dai un'occhiata a questo esempio: jsfiddle.net/sn70x2p6 Dopo il caricamento, la scheda occupa 61.000 KB di memoria. Dopo aver realizzato un milione di oggetti semplici, è 211.000 KB. Pazzo. Ora fai clic su "Rendi immutabile" e vedi cosa succede. Passa a un utilizzo della memoria superiore a 1 GB. L'esperienza potrebbe essere diversa, ma non molto.
Olav Kokovkin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.