javascript - JS V8 编译器优化、单态多态、(密封)对象和类、OOP

标签 javascript performance javascript-objects v8

我发现的所有关于 V8 和单态/多态的文章都只是提到对象的形状应该保持不变,因此 JIT 编译器可以将其优化为单态函数。但是像通过 OOP 和继承获得的类似形状的对象又如何呢?

我对以下非常常见的 OOP 案例感兴趣,其中有一堆相似形状的对象,就像拥有类层次结构时一样,其中类(及其对象)共享公共(public)属性。例如:

obj1 = {
  foo: 42,
  bar: true
}

obj2 = {
  baz: "abc",
  foo: 666,
  qux: null
}

现在,当某个函数仅使用 foo 属性时,我可以将所有这些不同的对象传递给它。从函数的 Angular 来看,它们都具有相同的形状 { foo: number } + *,但由于附加属性 bar,它们的实际形状当然是不同的bazqux

JIT 编译器是否以某种方式涵盖了这种情况?

如果不是,如何重构相似形状的对象以适应“单态”模式?

最佳答案

(这里是 V8 开发人员。)

简短回答:“相同”!=“相似”。

From the function's perspective they all have the same shape { foo: number } + *

不,这根本不是“相同形状”的意思。 “相同的形状”并不意味着“它们在某处都有一个 foo 属性”。例如,“相同的形状”意味着“它们分别具有三个属性 foobarbaz,按顺序排列”。 (实际的内部定义包括更多内容,但这就是结果。)

单态代码速度很快,因为它总是可以做同样的事情,例如总是加载第一个属性。而当它每次都必须决定要做什么时(“哦,这是 foo 是第二个属性的对象之一......哦,这是一个我从未见过的形状的对象”)之前见过,让我们看看它是否有 foo 属性以及它可能在哪里......”),然后所有弄清楚要做什么都会花费时间。

如果它对您的心理模型有帮助,您可以将其与体力工作进行比较。当工厂只生产一种车型时,您可以构建一个简单而快速的机器人,它可以在每辆汽车上拧紧完全相同的螺钉,并且它总是在完全相同的位置找到该螺钉。而在修理任意旧车的车库中,应该首先拧紧螺丝的机器人必须弄清楚螺丝在它正在查看的这辆特定汽车中的位置,以及如何到达螺丝。所有汽车都“相似”,因为它们某处都有一个松动的螺丝,这对机器人没有帮助;机器人的日子不好过,因为每辆车都是不同的。

Is such a case somehow covered by the JIT compiler?

当然,这需要更多的底层工作,但它工作得很好,而且通常足够快。当您没有性能问题时,不必担心过早优化。

how to refactor similar shaped objects to fit the "monomorphic" pattern?

使对象具有完全相同的形状。例如,使用相同的构造函数来构造它们,然后不要添加任何属性。 (当然,也不要将构造函数添加的某些属性设置为条件,否则会破坏要点。)

对于类层次结构,多态性通常很难或不可能避免。请参阅here相关问题。

关于javascript - JS V8 编译器优化、单态多态、(密封)对象和类、OOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76167593/

相关文章:

javascript - 水平移动一个div

MySQLWhere条件

Javascript为什么这个函数返回undefined

javascript - 如何将包含数组的对象转换为对象的对象

javascript - 检查用户的连接

javascript - 在 React Native + Redux 中使用 Navigator

javascript - 将 JQuery 验证与 JQuery 自动完成相结合

java - 2核Mac上有多个Java线程-慢

python - 从许多文本文件中快速删除前 n 行

javascript - 如何从数组中删除对象?