Redux bellek tüketimi [kapalı]


23

Redux çerçevesi, mevcut eylem açısından önceki durumdan yeni bir durum yaratılmasını teşvik eden değişmez durum / saf işlev paradigmasını desteklemektedir. Bu paradigmanın uygulanabilirliği şüphesizdir.

Benim asıl meselem, Redux redüktörleri, başlatılan her bir eylem için önceki durumlardan istekli bir şekilde yeni devletler getirmeleri, büyük bellek tüketiminin (bellek sızıntılarıyla karıştırılmaması) gerçek dünyadaki birçok uygulamada ortak bir olay haline gelmesidir. . Javascript uygulamalarının normalde bir tarayıcıda ortalama bir kullanıcının cihazlarında başka birkaç cihaza özel uygulama ve birkaç başka tarayıcı sekmesi ve penceresi de çalıştırabilen cihazlarda çalıştığını göz önüne alındığında, belleği koruma gereksinimi daha belirgin hale gelir.

Bir Redux uygulamasının hafıza tüketimini geleneksel Flux mimarisine benzeyen var mı? Eğer öyleyse, bulgularını paylaşabilirler mi?


4
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum, çünkü keyfi bellek profil bilgisi istiyor.

sen bunu profilli?

Neden profil yapmalıyım? Bariz onaylamak için? Benzer bir nesneyi tekrar tekrar ortaya çıkarmak, bellek kullanımı açısından ciddi bir ek yüke neden olmak mantıklı değil mi? @ Dan'ın cevabı bu ek yükü asgariye indirmenin bir yolunu sunar ve şimdiye kadarki en iyi cevaptır.
000

Yanıtlar:


30

Bu geçerli bir endişedir. Redux uygulamalarının hafıza kullanımını ölçmese de, Redux'u (veya bu konuda herhangi bir başka çerçeveyi) kullanmaya başlamadan önce uygulamanızın veri miktarlarını, sıklığını ve hesaplama yoğunluğunu taklit eden stres testleri oluşturmalısınız. inşa edecekler. Değişmezliğin benimsenmesi sizin durumunuzda işe yarayıp yaramadığı konusunda teknolojik kararlar vermeden önce bu stres testlerini kullanın.

Bazen insanların Redux konusunda kafaları karışır ve her eylemde devlet ağacının derinden klonlanması gerektiğini varsayalım. Bu kesinlikle durum böyle değil. Sadece değişen parçaların referanslarını değiştirmesi gerekir. Örneğin, bir eylem bir dizideki bir öğede bir değişikliğe neden olursa, aslında o öğenin ve dizinin kopyalanması gerekir, ancak dizideki diğer tüm öğeler kimliklerini korur. Çoğu zaman eylemler çok hedefli olduğundan ve birkaç durum anahtarını etkilediğinden ve Redux verileri normalize etmeyi teşvik ettiğinden, veri yapıları derinlemesine iç içe olmamalıdır, bu durum tipik webapps'ler için tahmin edebileceğinden çok daha az problemdir.

Yapısal olmayan listeleri dahili olarak kullanarak verimli listeleri ve haritaları uygulayan Immutable.js gibi kütüphaneleri kullanarak da keşfetmek isteyeceksiniz. Bu şekilde, bir listedeki birkaç öğeyi değiştirmek çok fazla kopya gerektirmez, çünkü hafızanın çoğu dahili olarak veri yapısının farklı versiyonları arasında paylaşılmaktadır.

Ancak sonuçta, söylemenin tek yolu uygulamanızın kullanım amacını yakından taklit eden stres testlerini yazmak ve kendiniz için verimliliği ölçmektir.


10
Immutable.js 'e atlamak için bu kadar hızlı olmayın. Bizim durumumuzda ciddi bir anı oldu. Immutable.js (muhtemelen) düzgün düz nesnelerinizi alır ve onları hafızaya aç canavarlara başlatır. Şu örneğe bir göz atın: jsfiddle.net/sn70x2p6 Yüklemeden sonra, sekme 61.000KB bellek alıyor. Bir milyon düz nesne yaptıktan sonra, 211.000KB. Çılgın. Şimdi "değişmez yap" ı tıklayın ve ne olduğunu görün. 1GB'tan fazla bellek kullanımına atlar. Deneyiminiz farklı olabilir, ama çok değil.
Olav Kokovkin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.