【问题标题】:What is the limit on the number of "fast", "inlinable" properties in v8 object?v8 对象中“快速”、“可内联”属性的数量限制是多少?
【发布时间】:2021-08-27 18:30:58
【问题描述】:

v8 专家的问题。

众所周知,如果对象的“形状”没有改变,v8 会将对象属性存储在一个特殊的数组中,并通过索引访问它们,这样访问速度非常快。我可能在细节上错了。

如 2018 年的 this blog post 中所述,此数组的大小限制为 1022。

这些信息仍然正确吗?也许最近在这方面有一些改进?

谢谢!

【问题讨论】:

  • 为什么需要提高这个数字?没有任何合理的对象具有这么多属性。对于更大的东西,无论如何你都会使用Map
  • @Bergi:“改进”并不意味着方向,它可能意味着提高或降低价值;-)
  • @Bergi 我的目标是在用户空间中实现更好的 v8 多态性:github.com/canonic-epicure/monopoly 我正在做一些关于如何做到这一点的小实验,其中一个将 v-table 存储为对象。问题是 v8 是以这种方式实现的,某个 mixin 的 v-table 需要包含该 mixin 所涉及的类的 所有 属性。因此需要大对象。当然,我希望快速访问 v-table 条目。
  • 在“改进”下,我的意思是增加课程的限制

标签: javascript caching limit inline v8


【解决方案1】:

虽然我不知道那篇博文是如何得出这个数字的,但 kMaxNumberOfDescriptors 的当前值是 1020,PropertiesArray 中的最大条目数是 1023。不知道为什么会有差异,也不确定这是否重要...在快速测试中,似乎 1020 是有效最大值,但也许我忽略了某种方法可以使对象增长到 1022 属性而不转换到字典模式。

元观察:JS 引擎中的对象处理比只有一个限制要复杂得多。参见例如TooManyFastProperties() 一些乐趣。

如果对象的“形状”没有改变,v8 将对象属性存储在一个特殊的数组中

这是不正确的简化。特别是,添加属性(构成形状更改)通常不会触发转换到字典模式。

【讨论】:

  • 感谢您的回答。当然 1020 和 1022 之间的差异并不显着。 TooManyFastProperties() 顺便说一句呢?它说明了一些关于不被视为常规属性的常量函数属性?
  • 是的;看起来它在某些情况下会更早地触发到字典模式的转换。
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多