【发布时间】:2017-02-17 08:01:51
【问题描述】:
JavaScript 中空对象的内存占用是多少?如果对象是使用对象字面量语法创建的:
let emptyObj = {};
在谷歌浏览器开发者工具(Profiles 标签)中,拍摄快照后,它显示 Shallow Size 以及 Retained Size 等于 56 字节。 此外,如果对象是由以下人员创建的,则存在相同的大小:
let emptyObj = Object.create(null);
对我来说,这太过分了,因为我在代码执行期间创建了很多对象(不一定是空的,但大多只有很少的属性)并且我必须将它们存储在内存中。我假设如果可以减小空对象的大小,那么也可以将具有属性的对象的大小减小相同的字节数。
例如,如果对象看起来像这样:
let foo = {bar: 4};
它的大小是 56(空对象开销)+ 6(键)+ 8(值)= 70 字节,然后减小大小空对象 40 字节将导致 foo 的大小为 30 字节 (16 + 6 + 8)。
这是对 Chrome 的空对象大小的正确解释吗?有可能减少吗?它会导致非空对象的大小减小吗?
【问题讨论】:
-
"可以减少吗?"不,您无法控制浏览器如何解释“创建对象”操作以及它在计算机内存中实际存储的内容以表示该操作。一般来说,只需停止担心 JS 中的对象大小,页面和 Web 应用程序实际上会使用数百个甚至数千个对象。只是不要忘记删除对不再需要的对象的引用,其余的由 GC 完成。
-
@proxeld 只是存储它们,看看你的表现如何受到影响。您可以从中进行的优化包括您是否应该真正将它们全部存储在内存中,或者您是否可以逐步创建它们,并确保您通过删除对未使用对象的引用来使用 GC。同样,一般来说,不要担心内存太多,除非你真的创建了一个内存猪。如果出于某种原因必须渲染这数百万个对象中包含的信息,我会更加担心。
-
您的对象是否具有所有相同的属性,并且所有道具都是原始类型(int、float、boolean)?
-
也许还不错。实现起来可能有点痛苦,但是您可以存储所有对象,展平在一个数组中,甚至更好,预先分配 ArrayBuffer。有点像 C structs 数组在 malloced 时布局。
-
@proxeld 仅保存差异而不是完整状态如何,并且每 100 个条目存储一个完整状态。根据每次迭代的状态变化量,这可以极大地减少内存占用,并且由于“关键帧”,您可以在合理的时间内重新创建每个状态。
标签: javascript object memory