javascript - 仅存在 ES6 setter/getter 就会导致不相关函数 (V8) 的性能下降

标签 javascript node.js google-chrome v8

1)制作一个对象并给它一个简单的方法,例如,

let R = {
  f: (x) => Math.sqrt(x)
}

2) 对其性能进行基准测试,例如,调用 f(x) 几百万次
3) 现在添加一个 setter/getter ,例如,
let R = {
  f: (x) => Math.sqrt(x),
  get h() {return 0}
}

4) 再次对 f(x) 进行基准测试。 chrome/node(V8 引擎)的性能显着下降。

对这种怪异有什么解释吗?

这是一个代码片段:https://codepen.io/iiroullin/pen/XWbwoVQ

解决方法:

似乎以旧 (ES5) 方式定义 getter/setter 并不会破坏 V8 优化。因此,虽然他们正在消除 ES6 中的所有问题,但可以使用以下方法代替 (3):
Object.defineProperty(R, 'h', {get: () => 0})

等等所有的getter/setter。

另一个修复:

使用类,请看下面的答案

最佳答案

我为此提交了一个错误:crbug.com/v8/10429

你能描述一下这是在什么情况下(除了微基准)出现的,特别是与在类上定义 getter 相比吗?以下似乎很快:

class C {
  f(x) { return Math.sqrt(x); }
  get h() { return 0; }
}
let R = new C();

for (...) {
  R.f(...);
}

我想使用类来定义非平凡的对象目前被认为是“最佳实践”;如果在某些情况下类不符合要求,那么最好知道这样引擎可以针对此类模式进行优化。

旁注@JaredSmith:术语“deopt”专门指当稍后在编译时做出的假设不成立时必须丢弃优化代码的情况。这不是这里发生的事情。

关于javascript - 仅存在 ES6 setter/getter 就会导致不相关函数 (V8) 的性能下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61282840/

相关文章:

javascript - 如何在浏览器环境中运行单元测试?

jquery - Chrome 中的 X-可编辑点击问题

javascript - 无法一一访问下面的结构?

javascript - 尝试禁用 Chrome 同源策略

java.lang.IllegalAccessError : tried to access method com. google.common.util.concurrent.SimpleTimeLimiter 与 Selenium ChromeDriver Chrome 与 Java

javascript - 半透明的 <img> 是否有可能影响它下面的元素?

javascript - 如何使用 jQuery 或 Javascript 禁用页面上的元素

javascript - Webpack - 编译两个具有不同 Assets 路径的输出包

node.js - puppeteer:在 DevTools 的网络选项卡中访问特定请求的 JSON 响应

node.js - S3 预签名 URL 多内容配置 header