V8 对象访问模式

Tags
javascriptv8
Created
May 11, 2018 11:49 AM

https://stackoverflow.com/questions/43594092/slow-delete-of-object-properties-in-js-in-v8/44008788

https://v8.js.cn/blog/fast-properties/

隐藏类(HiddenClass)占内存,但加快访问速度

in-object properties 是访问最快了,初始化时就预先确定了

稀疏数组的“空隙”会被标记以提高访问速度,但增加了内存占用

  • Dictionary(Slow) Mode:字典模式也称为哈希表模式,V8 使用哈希表来存储对象的属性。
  • Stable(Fast) Mode:使用类似数组(C Struct)结构来存储对象的属性并使用 Offset 进行访问。

node --allow-natives-syntax :

> const a = []
> a[100000] = [1]
> const b = [1]
> %DebugPrint(a)
...
- elements: 0x181d1b5513b9 <NumberDictionary[16]>...
> %DebugPrint(b)
...
- elements: 0x181df7e91f31 <FixedArray[1]>

新创建的小对象为快速模式(Fast Mode),当执行如下操作时会退化成为字典模式(Dictionary Mode):

  • 动态添加过多的属性
  • 删除非最后添加的属性(V8 >= 6.0)

在开发调试过程中,可以调用 V8 的 RuntimeCall (开启 --allow-natives-syntax)来判断与优化对象当前的状态:

  • %HasFastProperties(Object): 判断对象当前是否处于快速模式下。
  • %ToFastProperties(Object):强制优化对象到快速模式。
SuperMade with Super