首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅仅存在ES6设置器/getter就会在不相关的函数(V8)中导致性能下降。

仅仅存在ES6设置器/getter就会在不相关的函数(V8)中导致性能下降。
EN

Stack Overflow用户
提问于 2020-04-18 00:37:21
回答 1查看 673关注 0票数 6

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

代码语言:javascript
复制
let R = {
  f: (x) => Math.sqrt(x)
}

2)对其性能进行基准测试,例如,调用f(x)几百万次3)现在添加一个getter,例如,

代码语言:javascript
复制
let R = {
  f: (x) => Math.sqrt(x),
  get h() {return 0}
}

( 4)再次基准f(x)。铬/节点(V8引擎)的性能显著下降。

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

下面是一个代码片段,用于此:https://codepen.io/iiroullin/pen/XWbwoVQ

A解决方案:

似乎用旧的(ES5)方式定义getter/setters并不会破坏V8优化。因此,当他们在ES6中熨平所有的扭结时,而不是(3),我们可以使用以下方法:

代码语言:javascript
复制
Object.defineProperty(R, 'h', {get: () => 0})

对于所有的getter/setter来说都是如此。

另一个修复程序:

使用类,见下面的答案

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-18 17:23:17

我已经为这个注册了一个错误:crbug.com/v8/10429

您能描述在什么场景中(微基准测试除外),尤其是与定义类上的getter相比吗?以下几点似乎很快:

代码语言:javascript
复制
class C {
  f(x) { return Math.sqrt(x); }
  get h() { return 0; }
}
let R = new C();

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

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

附带注意@JaredSmith:术语"deopt“具体指的是在编译时所作的假设不成立时必须丢弃优化代码的情况。这里不是这样的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61282840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档