JavaScript 空对象大小

Posted

技术标签:

【中文标题】JavaScript 空对象大小【英文标题】:JavaScript empty object size 【发布时间】: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 个条目存储一个完整状态。根据每次迭代的状态变化量,这可以极大地减少内存占用,并且由于“关键帧”,您可以在合理的时间内重新创建每个状态。 【参考方案1】:

空对象不是那么空。 如果您执行emptyObj.__proto__ = null,它将删除__proto__ 链。但是对于Object的一些基本方法,它可能会抛出错误。然而,简单的属性分配和属性读取会很好地工作。希望它能为您节省一些字节。

【讨论】:

__proto__ 不是对象自己的属性。你不能delete它。如果您不了解它的工作原理,请不要使用它。无论如何,它已被弃用。请改用Object.setPrototypeOf/Object.getPrototypeOf 如果你想要一个真正的空对象,只需使用Object.create(null) 实例化它。不要乱用现有对象的原型链。 无论如何,指向Object.prototype的[[prototype]]链接和指向null的[[prototype]]链接在对象大小上几乎没有内存差异。 天才做他所知道的,天才做他想做的。在这种特殊情况下,您可以删除原型链,以减少使用的内存量。但是如果你删除__proto__,你就不能使用对象的一些内部方法,你必须知道这样做的后果。 @Bergi 如果你不敢绕过taboos 并打破常规,你永远不会成为一名优秀的程序员

以上是关于JavaScript 空对象大小的主要内容,如果未能解决你的问题,请参考以下文章

React Native(Expo)文件对象与 Javascript(jQuery)文件对象 - Blob/文件大小不同(YouTube 数据 API)

javascript 创建给定大小的空数组

javascript 变量作用域和内存问题

如何创建固定大小的对象数组

创建一个空的Map对象时,默认长度是多少

JavaScript RegExp 对象