仅仅存在 ES6 setters/getters 就会导致不相关函数 (V8) 的性能下降
Mere presence of ES6 setters/getters causes performance hit in an unrelated function (V8)
1) 创建一个对象并给它一个简单的方法,例如
let R = {
f: (x) => Math.sqrt(x)
}
2) 对其性能进行基准测试,例如调用 f(x) 几百万次
3) 现在添加一个getter,例如
let R = {
f: (x) => Math.sqrt(x),
get h() {return 0}
}
4) 再次对 f(x) 进行基准测试。 chrome/node(V8 引擎)的性能显着下降。
对这种怪异现象有什么解释吗?
这是一个代码笔片段:https://codepen.io/iiroullin/pen/XWbwoVQ
解决方法:
似乎定义 getters/setters 旧的 (ES5) 方式并没有破坏 V8 优化。因此,虽然他们正在解决 ES6 中的所有问题,但可以使用这个代替 (3):
Object.defineProperty(R, 'h', {get: () => 0})
等等 getters/setters.
另一个修正:
使用类,看下面的答案
我为此提交了一个错误:crbug.com/v8/10429
您能否描述在什么情况下(微基准测试除外)出现这种情况,特别是与在 类 上定义吸气剂相比?以下似乎很快:
class C {
f(x) { return Math.sqrt(x); }
get h() { return 0; }
}
let R = new C();
for (...) {
R.f(...);
}
我想使用 类 来定义非平凡的对象目前被认为是 "best practice";如果在某些情况下 类 不符合要求,那么最好知道这样引擎可以针对此类模式进行优化。
旁注@JaredSmith:术语 "deopt" 特指当稍后在编译时做出的假设不成立时不得不丢弃优化代码的情况。这不是这里发生的事情。
1) 创建一个对象并给它一个简单的方法,例如
let R = {
f: (x) => Math.sqrt(x)
}
2) 对其性能进行基准测试,例如调用 f(x) 几百万次 3) 现在添加一个getter,例如
let R = {
f: (x) => Math.sqrt(x),
get h() {return 0}
}
4) 再次对 f(x) 进行基准测试。 chrome/node(V8 引擎)的性能显着下降。
对这种怪异现象有什么解释吗?
这是一个代码笔片段:https://codepen.io/iiroullin/pen/XWbwoVQ
解决方法:
似乎定义 getters/setters 旧的 (ES5) 方式并没有破坏 V8 优化。因此,虽然他们正在解决 ES6 中的所有问题,但可以使用这个代替 (3):
Object.defineProperty(R, 'h', {get: () => 0})
等等 getters/setters.
另一个修正:
使用类,看下面的答案
我为此提交了一个错误:crbug.com/v8/10429
您能否描述在什么情况下(微基准测试除外)出现这种情况,特别是与在 类 上定义吸气剂相比?以下似乎很快:
class C {
f(x) { return Math.sqrt(x); }
get h() { return 0; }
}
let R = new C();
for (...) {
R.f(...);
}
我想使用 类 来定义非平凡的对象目前被认为是 "best practice";如果在某些情况下 类 不符合要求,那么最好知道这样引擎可以针对此类模式进行优化。
旁注@JaredSmith:术语 "deopt" 特指当稍后在编译时做出的假设不成立时不得不丢弃优化代码的情况。这不是这里发生的事情。