为什么要创建多个单态缓存而不是一个多态

时间:2016-10-10 19:06:03

标签: javascript v8

我正在阅读关于单态的this article,并且那里有以下代码段:

function ff(b, o) {
  if (b) {
    return o.x
  } else {
    return o.x
  }
}

ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
  

函数ff中有多少属性访问内联缓存?什么是   说他们在吗?   答案:有2个缓存,两个都是单态的,因为每个缓存只能看到一个形状的对象。

我认为会有一个多态,因为之前的作者显示:

f({ x: 4, y: 1 }) // polymorphic, degree 2
f({ x: 5, z: 1 }) // polymorphic, degree 3
f({ x: 6, a: 1 }) // polymorphic, degree 4
f({ x: 7, b: 1 }) // megamorphic

该函数传递不同结构的对象,并将单态缓存变为多态。为什么与有问题的例子有所不同?

2 个答案:

答案 0 :(得分:3)

代码中每个不同的属性引用都存在这些“内联缓存”。因此在函数中:

return

这两个return语句都有自己的内联缓存。由于在示例中调用函数的方式,第一个ff()仅发生在第一个形状的对象上,而第二个仅发生在第二个形状的对象上。因此,每个缓存(在对ff(true, { x: 1, z: 10 }); 的四次调用之后)只会看到1个形状。

第五次之后调用此函数:

String type = Files.probeContentType(Paths.get(filepath));

第一个IC会看到两个形状,因此它的IC将是多态的。

答案 1 :(得分:2)

每个属性访问o.x都有自己的IC,即使多次访问同一对象的相同属性也是如此。

如果您运行node --trace-ic someScript.js,则可以查看IC所属的行号。