V8 Hidden 类 for two objects of the same type are not the same if 属性 types are different
V8 Hidden classes for two objects of the same type are not the same if property types are different
我已经阅读了 V8 中隐藏的 classes 并在 d8 调试器中进行了一些测试 shell。
function Vector(a, b) {
this.a = a;
this.b = b;
}
var x = new Vector(1, 2);
var y = new Vector(1, 3);
var z = new Vector(1, 'a');
print( %HaveSameMap( x, y ) ); //true
print( %HaveSameMap( x, z ) ); //false
x.b;
print( %HaveSameMap( x, z ) ); //true
print( %HaveSameMap( y, z ) ); //false
y.b;
print( %HaveSameMap( y, z ) ); //true
正如我们所看到的,如果对象 属性 类型不同,它们不会共享它们的隐藏 class,直到我们尝试访问类型不同的 elder 对象中的 属性 .任何人都可以清楚地解释发生了什么"behind the scenes",也许它与内联缓存有关。
这里是 V8 开发人员。简而言之,发生的事情是 "hidden classes" 不仅存储有关属性存在的信息,而且还存储有关其值的(相对粗粒度的)类型信息。为避免有太多不同的隐藏 classes,当对象被触摸时它们会合并。
在你的例子中:
var x = new Vector(1, 2);
var y = new Vector(1, 3);
x
和 y
现在都有一个隐藏的 class HC1
知道 "I have a property .b
, and its value is always a small integer (a.k.a. Smi)"。但随后发生了这种情况:
var z = new Vector(1, 'a');
所以 z
需要那个隐藏 class 的更新版本,因为它的 .b
的值是一个字符串。 V8 目前还没有记住 "the value could be an integer or string";相反,它只是丢弃类型信息。所以 z
得到一个新的隐藏 class HC2
知道 "I have a property .b
(but I know nothing about its value, it could be anything)"。当创建这个隐藏的class HC2
时,HC1
被标记为"outdated";但为了节省时间,未使用 HC1
查找和更新对象。当你 运行
x.b;
然后 V8 必须查看 x
及其隐藏的 class HC1
,并且它注意到 HC1
已被标记为 "outdated",因此它找到更新版本 HC2
并更新 x
以使用它。
优化像 JavaScript 这样的动态语言非常复杂 ;-)
我已经阅读了 V8 中隐藏的 classes 并在 d8 调试器中进行了一些测试 shell。
function Vector(a, b) {
this.a = a;
this.b = b;
}
var x = new Vector(1, 2);
var y = new Vector(1, 3);
var z = new Vector(1, 'a');
print( %HaveSameMap( x, y ) ); //true
print( %HaveSameMap( x, z ) ); //false
x.b;
print( %HaveSameMap( x, z ) ); //true
print( %HaveSameMap( y, z ) ); //false
y.b;
print( %HaveSameMap( y, z ) ); //true
正如我们所看到的,如果对象 属性 类型不同,它们不会共享它们的隐藏 class,直到我们尝试访问类型不同的 elder 对象中的 属性 .任何人都可以清楚地解释发生了什么"behind the scenes",也许它与内联缓存有关。
这里是 V8 开发人员。简而言之,发生的事情是 "hidden classes" 不仅存储有关属性存在的信息,而且还存储有关其值的(相对粗粒度的)类型信息。为避免有太多不同的隐藏 classes,当对象被触摸时它们会合并。
在你的例子中:
var x = new Vector(1, 2);
var y = new Vector(1, 3);
x
和 y
现在都有一个隐藏的 class HC1
知道 "I have a property .b
, and its value is always a small integer (a.k.a. Smi)"。但随后发生了这种情况:
var z = new Vector(1, 'a');
所以 z
需要那个隐藏 class 的更新版本,因为它的 .b
的值是一个字符串。 V8 目前还没有记住 "the value could be an integer or string";相反,它只是丢弃类型信息。所以 z
得到一个新的隐藏 class HC2
知道 "I have a property .b
(but I know nothing about its value, it could be anything)"。当创建这个隐藏的class HC2
时,HC1
被标记为"outdated";但为了节省时间,未使用 HC1
查找和更新对象。当你 运行
x.b;
然后 V8 必须查看 x
及其隐藏的 class HC1
,并且它注意到 HC1
已被标记为 "outdated",因此它找到更新版本 HC2
并更新 x
以使用它。
优化像 JavaScript 这样的动态语言非常复杂 ;-)