gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:11:58 27 4
gpt4 key购买 nike

给定

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;
}
});

使用 getter/setter 函数

obj.aSetter(2);
obj.aGetter();

与直接属性访问相比,Chrome/V8 性能会有所下降(~3 倍):

obj._a = 2;
obj._a;

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

obj.a = 2;
obj.a;

将导致 ~30 倍的 Chrome 性能下降(从 41 到最新)性能 - 几乎与 Proxy 一样慢。而 Firefox 和旧版 Chrome 版本使用描述符 getter/setter 没有显着的性能损失。

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

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

最佳答案

性能变化与this Chromium issue相关(致谢@VyacheslavEgorov)。

为避免性能问题,应改用原型(prototype)。这是可以使用单例类对对象进行一次实例化的少数几个原因之一。

使用 ES5:

var _a = 1;

function Obj() {}

Object.defineProperty(Obj.prototype, 'a', {
enumerable: true,
get: function () {
return _a;
},
set: function(val) {
_a = val;
}
});

var obj = new Obj();
// or
var obj = Object.create(Obj.prototype);

或者使用 ES6 语法糖:

class Obj {
constructor() {
this._a = 1;
}

get a() {
return this._a;
}

set a(val) {
this._a = val;
}
}

let obj = new Obj();

关于javascript - 近期 Chrome/V8 版本中的对象描述符 getter/setter 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36338289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com