Redux内存消耗


23

Redux框架支持不变的状态/纯函数范式,该范式促进了根据当前操作从先前状态创建新状态。这种范例的适用性是毋庸置疑的。

我的一个主要问题是,由于Redux精简器急于为每个调用的每个动作从以前的状态返回新的新状态,因此,大量的内存消耗(不要与内存泄漏混淆)将在许多实际应用程序中屡见不鲜。 。考虑到Javascript应用程序通常可以在普通用户设备的浏览器中运行,而该浏览器也可以运行其他几个特定于设备的应用程序以及更多浏览器选项卡和窗口,那么节省内存的必要性就变得越来越明显。

有人真的将Redux应用程序的内存消耗与传统的Flux架构进行了比较吗?如果是这样,他们可以分享他们的发现吗?


4
我投票结束这个题为离题的问题,因为它要求提供任意的内存分析信息。

异形它?

我为什么要配置它?确认明显吗?一遍又一遍地产生一个类似的对象会在内存使用方面引起严重的开销,这不是常识吗?@Dan的答案提供了一种减少开销的方法,这是迄今为止最好的答案。
000 000

Answers:


30

这是一个有效的担忧。尽管我尚未测量Redux应用程序的内存使用情况,但我认为在致力于使用Redux(或其他任何框架)之前,您应该创建压力测试,以模拟您的应用程序的数据量,更改频率和计算强度将要建立。在就采用不变性在您的特定情况下是否可行做出技术决定之前,使用这些压力测试。

请注意,有时人们对Redux感到困惑,并认为在每个操作上都必须深深克隆状态树。绝对不是这样。仅更改的部分需要更改其引用。例如,如果一个动作使得在阵列中的变化到一个项目,确实,该项和该阵列将需要被复制,但是,数组中的所有其他元素将保持其标识。因为大多数时候动作都是针对性强的,并且会影响几个状态键,并且由于Redux鼓励规范化数据以使数据结构不会深度嵌套,所以对于典型的Web应用程序来说,这比人们想象的要少得多。

您还将希望使用Immutable.js之类的库进行探索,这些库通过内部使用结构共享来实现不可变列表和有效映射。这样,更改列表中的一些项目不会涉及太多的复制,因为内部大部分内存是在不同版本的数据结构之间共享的。

但是最后,唯一的方法就是编写压力测试,以紧密模拟您的应用程序的预期用途,并为您自己衡量效率。


10
不要这么快就跳到Immutable.js。在我们的情况下,它已成为严重的记忆猪。Immutable.js将您的(大概)整洁的普通对象带入实例,使其成为需要大量内存的怪物。请看以下示例:jsfiddle.net/sn70x2p6加载后,该选项卡占用61,000KB内存。制作一百万个普通对象后,它的大小为211,000KB。疯。现在单击“使不可变”,看看会发生什么。它的内存使用量跃升至1GB以上。您的经验可能有所不同,但差别不大。
Olav Kokovkin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.