How does V8 inline caching work with delete and computed property access?(V8内联缓存如何与删除和计算属性访问一起工作?)
问题描述
如https://github.com/v8/v8/wiki/Design%20Elements#fast-property-access中所示,我试图理解对象的属性是基于其构造函数的隐藏类(称为"C[N]")存储的。我可能没有正确地理解它。例如:// Let's suppose Object has these hidden classes already
/* Object[[HiddenClasses]] > C0, C1, C2
*
* C0 - for "x", goto C1
* C1 - "x"; for "y", goto C2
* C2 - "x", "y";
*/
var obj = {
x: 0
};
// Currently based in C1 to get/put properties
obj.y = 0;
// Now based in C2
1.如果此新对象添加新属性,会发生什么情况?
obj.z = 0
它的行为是否仍与Object
的第一个实例相同?
2.如果同一构造函数的对象以与隐藏类相反的顺序添加属性,会发生什么情况?
({ y: 5; }); // Will this be based in C2?
3.如果删除属性,会发生什么情况?其值是否仅在内存中更改以表示deleted
?
4.当编译器无法看到其计算属性访问的对象或名称时,是否在隐藏类中进行查找?即:
({ [Math.random()]: 0 }),
randomlyReceivedObject.property;
推荐答案
在
obj.z = 0
之后,C2
获取新的转换for "z", goto C3
,并为该对象创建新的隐藏类C3 - "x", "y", "z"
。
该对象将有一个新隐藏类。和删除属性时,对象将进入字典模式,并且不再使用隐藏类来跟踪其属性。在内部,这是通过一个特殊的隐藏类实现的:
C6 - all properties are in the properties dictionary
。然后,每个后续的属性访问都需要查找字典。如果您想避免这种情况,您可以手动覆盖属性,而不是删除它们:obj.x = null
或类似的。(详细说明:在最新的V8版本中,有一个例外,如果删除了last属性,则回滚最后一个隐藏的类转换。此实现细节在未来可能会保留,也可能不会保留,因此不要依赖它。)隐藏类始终用于查找。内联缓存只是缓存这些查找的结果;这总是在执行时发生,而不是在编译时。"编译器"通常无法"看到"对象,因为在编译时还没有对象。
C0
获得新的转换:for "y", goto C4
。如果该对象稍后获得"x"属性,则将创建一个新隐藏类C5 - "y", "x"
,并在C4
:for "x", goto C5
中进行转换。C5
和C2
将永远保持不同。这实际上是由JavaScript规范规定的,因为例如for..in
循环Object.getOwnPropertyKeys
必须按照创建顺序迭代属性,而V8通过隐藏类跟踪属性创建顺序。
由于拥有更多隐藏类自然会有速度和内存成本,因此通常建议始终以相同的顺序创建属性(例如,通过使用构造函数)。/li>
这篇关于V8内联缓存如何与删除和计算属性访问一起工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:V8内联缓存如何与删除和计算属性访问一起工作?
基础教程推荐
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 响应更改 div 大小保持纵横比 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 悬停时滑动输入并停留几秒钟 2022-01-01
- 动态更新多个选择框 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01
- 在for循环中使用setTimeout 2022-01-01