JavaScript 空对象大小

JavaScript empty object size

提问人:proxeld 提问时间:10/8/2016 更新时间:10/10/2016 访问量:1435

问:

JavaScript 中空对象的内存占用量是多少?如果使用对象文本语法创建对象:

let emptyObj = {};

在 Google Chrome 开发人员工具(“配置文件”选项卡)中,拍摄快照后,它显示“浅层大小”和“保留大小”等于 56 字节。 此外,如果对象是由以下方式创建的,则存在相同的大小:

let emptyObj = Object.create(null);

对我来说,这太过分了,因为我在代码执行期间创建了很多对象(不一定是空的,但大多数只有几个属性),我必须将它们存储在内存中。我假设,如果可以减小空对象的大小,也可以将具有属性的对象的大小减小相同的字节数。

例如,如果对象如下所示:

let foo = {bar: 4};

它的大小为 56(空对象开销)+ 6(键)+ 8(值)= 70 字节,然后将空对象的大小减少 40 字节将导致 foo 的大小为 30 字节 (16 + 6 + 8)。

这是对 Chrome 空对象大小的正确解释吗?是否有可能减少它?它会导致非空对象的大小减小吗?

JavaScript 对象 内存

评论

4赞 Dimitris Karagiannis 10/8/2016
“有没有可能减少它?”不。您无法控制浏览器如何解释“创建对象”操作,以及它实际存储在计算机内存中的内容来表示该操作。一般来说,只需停止担心 JS 中的对象大小,页面和 Web 应用程序实际上使用了数百甚至数千个对象。只是不要忘记删除对你不再需要的对象的引用,GC将完成剩下的工作。
1赞 Dimitris Karagiannis 10/8/2016
@proxeld只需存储它们,看看您的性能会受到怎样的影响。您可以从那里进行的优化包括您是否应该将它们全部存储在内存中,或者您可以逐步创建它们,并通过删除对未使用对象的引用来确保您正在使用 GC。同样,一般来说,不要担心内存,除非你真的创造了一个内存猪。如果出于某种原因我不得不渲染这数百万个对象中包含的信息,我会更担心。
1赞 pleup 10/8/2016
您的对象是否具有所有相同的属性,并且所有 prop 都是原始类型(int、float、boolean)?
1赞 pleup 10/8/2016
也许还不错。实现起来可能有点痛苦,但您可以将所有对象存储在单个数组中,甚至更好,预分配 ArrayBuffer。有点像 C 结构,数组在错位时布局。
1赞 Thomas 10/8/2016
@proxeld 如何只保存差异而不是完整状态,并且每 100 个条目存储一个完整状态。根据每次迭代的状态变化量,这可以大大减少内存占用,并且由于“关键帧”,您可以在合理的时间内重新创建每个状态。

答:

-2赞 Thevs 10/9/2016 #1

空对象不是那么空。 如果这样做,它将删除链。但是,它可能会为某些基本方法抛出错误。但是,简单的属性赋值和属性读取效果很好。希望它能为您节省一些字节。emptyObj.__proto__ = null__proto__Object

评论

0赞 Bergi 10/9/2016
__proto__不是对象的自身属性。你不能。如果您不了解它是如何工作的,请不要使用它。无论如何,它已被弃用。请改用 /。deleteObject.setPrototypeOfObject.getPrototypeOf
0赞 Bergi 10/9/2016
如果你想要一个真正空的对象,只需使用 .不要弄乱现有对象的原型链。Object.create(null)
0赞 Bergi 10/9/2016
无论如何,指向 的 [[prototype]] 链接和指向 的 [[prototype]] 链接之间的对象大小几乎没有内存差异。Object.prototypenull
0赞 Thevs 10/10/2016
天才做他知道的,天才做他想做的事。在这种特殊情况下,您可以删除原型链,以减少使用的内存量。但是,如果删除 ,则不能使用对象的某些内部方法,并且必须知道这样做的后果。__proto__
0赞 Thevs 10/10/2016
@Bergi 如果你不敢四处走动并打破常见的规则,你永远不会成为一个好的程序员。taboos