v8原理——对象的存储和访问

V8 实现对象存储时,并没有完全采用字典的存储方式,这主要是出于性能的考量。 因为字典是非线性的数据结构,查询效率会低于线性的数据结构,V8 为了提升存储和查找 效率,采用了一套复杂的存储策略。

常规属性 (properties) 和排序属性 (element)
  • 把对象中的数字属性称为排序属性,在 V8 中被称为 elements。 数字属性应该按照索引值大小升序排列
  • 字符串属性就被称为常规属性,在 V8 中被称为 properties,字符串属性根据创建时的顺序升序排列
  • 两个属性都有时,排序属性先于常规属性。
  • 在 V8 内部,为了有效地提升存储和访问这两种属性的性能,分别使用了两个线性数据结构 来分别保存排序属性和常规属性。分解成这两种线性数据结构之后,如果执行索引操作,那么 V8 会先从 elements 属性中按 照顺序读取所有的元素,然后再在 properties 属性中读取所有的元素,这样就完成一次索引操作。
  • 对象内属性,将部分常规 属性直接存储到对象本身, 对象内属性的数量是固定的,默认是 10 个,如果添加的属性超出了对象分配的空间, 则它们将被保存在常规属性存储中。
  • 如果对象中的属性过多时,或者存在反复添加或者删除属性的操作,那么 V8 就会将线 性的存储模式降级为非线性的字典存储模式,这样虽然降低了查找速度,但是却提升了修改 对象的属性的速度。

你可能感兴趣的:(javascript)