Konsumsi memori redux [tertutup]

23

Kerangka kerja Redux mendukung negara / paradigma fungsi murni, yang mempromosikan penciptaan negara baru dari negara sebelumnya dalam hal tindakan saat ini. Penerapan paradigma ini tidak dapat dielakkan.

Kekhawatiran utama saya adalah bahwa, ketika Redux mengurangi dengan penuh semangat mengembalikan negara baru dari negara sebelumnya untuk setiap tindakan yang dilakukan, pengurasan memori besar-besaran (jangan dikacaukan dengan kebocoran memori) akan menjadi kejadian umum di banyak aplikasi dunia nyata. . Ketika mempertimbangkan bahwa aplikasi Javascript biasanya berjalan di browser di perangkat rata-rata pengguna yang juga bisa menjalankan beberapa aplikasi spesifik perangkat lainnya dan beberapa tab browser dan jendela lebih, kebutuhan untuk menghemat memori menjadi semakin jelas.

Adakah yang benar-benar membandingkan konsumsi memori aplikasi Redux dengan arsitektur Flux tradisional? Jika demikian, dapatkah mereka membagikan temuan mereka?

000
sumber
4
Saya memberikan suara untuk menutup pertanyaan ini sebagai di luar topik karena meminta informasi profil memori yang berubah-ubah.
Sudahkah Anda membuat profil?
Mengapa saya harus membuat profil? Untuk mengkonfirmasi yang sudah jelas? Apakah tidak masuk akal bahwa menelurkan objek yang sama berulang kali menimbulkan overhead yang serius dalam hal penggunaan memori? @ Dan jawaban menyediakan cara untuk meminimalkan overhead itu dan itu adalah jawaban terbaik sejauh ini.
000

Jawaban:

30

Ini adalah kekhawatiran yang valid. Meskipun saya belum mengukur penggunaan memori aplikasi Redux, saya pikir sebelum berkomitmen untuk menggunakan Redux (atau kerangka kerja lainnya), Anda harus membuat tes stres yang meniru jumlah data, mengubah frekuensi, dan intensitas komputasi aplikasi yang Anda gunakan. akan membangun. Gunakan tes stres ini sebelum membuat keputusan teknologi tentang apakah mengadopsi ketidakberdayaan bekerja dalam kasus khusus Anda.

Perhatikan bahwa kadang-kadang orang bingung tentang Redux dan menganggap bahwa pada setiap tindakan, pohon negara harus dikloning secara mendalam. Ini sama sekali tidak terjadi. Hanya bagian yang diubah yang perlu diubah referensi mereka. Misalnya, jika suatu tindakan menyebabkan perubahan ke satu item dalam array, tentu saja, item itu dan array perlu disalin, namun , semua elemen lain dalam array akan menyimpan identitasnya. Karena sebagian besar waktu tindakan sangat bertarget dan memengaruhi beberapa kunci negara, dan karena Redux mendorong normalisasi data sehingga struktur data tidak bersarang secara mendalam, ini jauh lebih sedikit masalah bagi webapps tipikal daripada yang dibayangkan orang.

Anda juga ingin menjelajah menggunakan pustaka seperti Immutable.js yang mengimplementasikan daftar dan peta yang tidak dapat diubah secara efisien dengan menggunakan pembagian struktural secara internal. Dengan cara ini, mengubah beberapa item dalam daftar tidak melibatkan banyak penyalinan karena secara internal sebagian besar memori dibagikan di antara versi struktur data yang berbeda.

Namun pada akhirnya, satu-satunya cara untuk mengetahuinya adalah dengan menulis tes stres yang dengan ketat meniru penggunaan aplikasi yang dimaksudkan, dan mengukur efisiensi untuk diri sendiri.

Dan
sumber
10
Jangan terlalu cepat untuk melompat ke Immutable.js. Ini menjadi ingatan yang serius dalam kasus kami. Immutable.js mengambil (mungkin) objek polos Anda dan instantiate menjadi monster yang haus memori. Lihatlah contoh ini: jsfiddle.net/sn70x2p6 Setelah dimuat, tab tersebut membutuhkan memori 61.000KB. Setelah membuat sejuta benda, itu 211.000 KB. Gila. Sekarang klik "make immutable" dan lihat apa yang terjadi. Itu melompat ke penggunaan memori lebih dari 1GB. Pengalaman Anda mungkin berbeda, tetapi tidak banyak.
Olav Kokovkin