【问题标题】:Memory allocation of for the same objects in different arrays不同数组中相同对象的内存分配
【发布时间】:2020-05-23 19:58:18
【问题描述】:

我试图了解像 V8 这样的 JS 引擎如何处理数组中的对象,特别是内存是如何分配的以及它是否有效。

我有一个包含未排序对象的数组,我生成了一个在排序数组中包含相同对象的数组

let obj1 = {'test': 'test1'};
let obj2 = {'test': 'test2'};
let obj3 = {'test': 'test3'};

let arr1 = [obj1,obj3,obj2];

...Do sorting and create a new array (no I don't want to destroy the previous)
let arr2 = [obj1,obj2,obj3];

内存开销仅在索引和对象之间创建的引用中,还是我实际上在内存空间中复制了对象?

【问题讨论】:

  • 唯一新的是数组。对象引用不会产生这些对象的副本。您可以通过修改数组中的一个对象来验证这一点,并检查原始对象引用是否也被修改。会的,因为它是同一个对象。
  • 您有两个数组,其中包含相同的对象引用值。因此,大小将(大致)为3*<size of object ref> + <array overhead>
  • 对象是参考值。除非您显式创建一个新对象,否则一切都只会复制对现有对象内容的引用。
  • 有道理,谢谢!

标签: javascript arrays v8 spidermonkey


【解决方案1】:

在 Mozilla 的引擎 Spidermonkey 中,对象数组将由 jsval 的 C++ 数组表示。 jsval 是 64 位量,在表示 JS 对象时,实际上是指针。

所以你的问题的答案是,底层表示基本上是一个指针数组,这是你能得到的最有效的。

我说“基本上”,因为一旦你开始创建一个具有大的稀疏间隙、非数值属性或一堆其他东西的数组——引擎就会去专门化它,基本上像内部对象一样存储它。

我还没有阅读 v8 源代码的这一部分,但我相信实现是相似的。一旦您进入其中,这样做就很明显了,并且两个引擎在数组属性访问方面的性能非常接近。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多