如果V8在物体生长时重新洗涤



说您的对象有一个更改,该对象会触发基础数组大小或数据结构存储哈希值的变化。

var x = { a: 1, b: 2, c: 3 }
// trigger a resize theoretically
x.d = 4
x.e = 5
x.f = 6

说哈希的基础阵列在v8

中看起来像这样
[ 1, 3, 2, null, null ]

它最初创建了一些额外的空间。但这还不够,所以它必须成长。有两个选择。

  1. 它生长在当前的地方留下原始值。
  2. 它成长并重新升级,将价值移至任意新地方。

所以看起来像:

// (1) 1, 3, 2 stay where they are
[ 1, 3, 2, 6, 4, 5, null, null, null, null ]
// (2) 1, 3, 2 are moved
[ 6, 2, 5, 3, 4, 1, null, null, null, null ]

想知道V8在这种情况下的作用。还想知道调整大小的启发式方法是什么(在阵列长出等时,它是否将数组大小加倍。(。

V8引擎使用两个对象表示:

  • 字典模式 - 将对象存储为键 - 值地图作为哈希地图。
  • 快速模式 - 对象像结构一样存储,其中属性访问中不涉及计算。

快速模式通常要访问属性速度要快得多 - 但要求对象的结构已知。

v8最初将尝试构造对象看起来像"隐藏类"的模板。该对象将通过隐藏的类转换,直到V8将放弃并将对象作为慢速属性存储为止。

我在"蓝鸟的util.tofastproperties函数如何使对象的属性"快速"中的相关代码中更深入地深入研究?"。

至于您的直接问题,对象将在这些属性分配上"快速分配"(在每个此类分配上(并迁移到其他地图(根据需要复制内存(。

v8已经发布了有关它们如何存储属性的详细博客文章。

对于字典属性v8(在您的示例中不是这种情况(的情况下,基础数据结构是哈希地图,因此在基础数组中的实际位置更改。

但是,JavaScript要求按插入顺序迭代属性。因此,当前每个字典都会跟踪其插入位置以适当的顺序迭代条目。

v8保留使用2的词语对字典大小,并试图使它们保持大约50%的空,以避免频繁的哈希碰撞。

最新更新