相关疑难解决方法(0)

最近的Chrome/V8版本中的对象描述符getter/setter性能

特定

var obj = {};

var _a = 1;

obj._a = 1;

obj.aGetter = function() {
  return _a;
}

obj.aSetter = function(val) {
  _a = val;
}

Object.defineProperty(obj, 'a', {
  enumerable: true,
  get: function () {
    return _a;  
  },
  set: function(val) {
    _a = val;
  }     
});
Run Code Online (Sandbox Code Playgroud)

使用getter/setter函数

obj.aSetter(2);
obj.aGetter();
Run Code Online (Sandbox Code Playgroud)

与直接属性访问相比,Chrome/V8性能会降低一些(~3x):

obj._a = 2;
obj._a;
Run Code Online (Sandbox Code Playgroud)

这是可以理解的.并使用描述符getter/setter

obj.a = 2;
obj.a;
Run Code Online (Sandbox Code Playgroud)

将导致Chrome(41到最新)性能下降约30倍 - 几乎与Proxy.虽然Firefox和较旧的Chrome版本使用描述符getter/setter而没有显着的性能损失.

在最近的Chrome/V8版本中,描述符getter/setter性能的确切问题是什么?这是一个可以监控的已知问题吗?

测量使用Benchmark.js(jsPerf引擎)完成.我无法提供jsPerf测试的链接来可视化差异,因为jsPerf已经严重搞砸了它的反DDoS措施,但我确信现有的可以证明一点.

javascript google-chrome v8

7
推荐指数
1
解决办法
2803
查看次数

标签 统计

google-chrome ×1

javascript ×1

v8 ×1