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

2024-01-02

Given

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;

会引发Chrome 减少约 30 倍(41 到最新)性能 - 几乎和Proxy。虽然 Firefox 和旧版 Chrome 使用描述符 getter/setter,但没有显着的性能损失。

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

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


业绩变化与这个铬问题 https://codereview.chromium.org/714883003(致谢@VyacheslavEgorov)。

为了避免性能问题,应该使用原型。这是单例类可用于一次实例化对象的少数原因之一。

使用 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最新 Chrome/V8 版本中的对象描述符 getter/setter 性能 的相关文章

随机推荐

  • 回发后视图状态不保留

    我在保持控件回发时的视图状态时遇到一些问题 vb net 这是我在控制中放入的一些代码 Protected Overrides Sub OnInit ByVal e As System EventArgs MyBase OnInit e M
  • 如何避免在 TEdit 聚焦时按下 Escape 时发出叮当声?

    在我几年前开发的代码中 我经常使用它来随时按 Escape 键关闭当前表单 procedure TSomeForm FormKeyPress Sender TObject var Key Char begin if key 27 then
  • Shibboleth - 如何读取属性?

    我已使用 Shibboleth 成功登录到我的服务提供商测试页面 然后我转到 Shibboleth sso Session 页面 我看到以下内容 Attributes affiliation 1 value s entitlement 1
  • 我可以制作图案密码屏幕锁定 android 应用程序吗

    有人有开发应用程序来替换默认锁定屏幕的经验吗 我被告知这是不可能的 但是this http www 1mobile com pattern password screen locker 849722 html应用程序管理它 您知道的任何教程
  • 新手批量问题-创建文件

    我正在开发一个批处理程序 该程序可以扫描 PC 的各个部分 并将它们记录到文件中 令人惊讶的是 我无法让程序创建要写入的文件 然后我尝试创建一个文件 我相当确定它会起作用 如下 echo off ipconfig gt ip txt tim
  • Android:视图类和活动类的 startActivityForResult 和 setResult

    我很困惑 不知道如何使用 startActivityResults 和 setResults 从以前的活动中获取数据 我有一个视图类和一个活动类 基本上在我的视图类中 我有这个对话框 它实际上会启动称为 colorActivity 类的活动
  • 如何使 Spark 驱动程序能够适应 Master 重启?

    我有一个 Spark Standalone 不是 YARN Mesos 集群和一个正在运行的驱动程序应用程序 在客户端模式下 它与该集群通信以执行其任务 但是 如果我关闭并重新启动 Spark 主节点和工作节点 驱动程序不会重新连接到主节点
  • 写入文本文件

    我正在寻找一种用 C 写入文本文件的方法 我创建了一个表单 其中包含名字 姓氏 电话号码 出生日期的文本框 当用户点击按钮时 我希望将该信息写入文本文件 我发现的例子并没有真正告诉我如何做到 所以这就是我在这里问的原因 最简单的方法就是使用
  • Spark中Map任务内存消耗巨大

    我有很多文件 大约包含 60 000 000 行 我的所有文件都采用以下格式 timestamp producer messageId data bytes n 我一一浏览我的文件 并且还想为每个输入文件构建一个输出文件 因为有些台词依赖于
  • robocopy 无效参数“-”

    我正在尝试完成我的批处理脚本 但在某些情况下它会失败 这是我正在运行的命令 ROBOCOPY C test dash2 Hello 4 C test dash2 Hello 4 MOV 这是我收到的错误 ROBOCOPY Robust Fi
  • 将图例名称设置为匿名 geom_function

    有没有办法为匿名 geom function 设置图例名称 我设法为不同种类的鸢尾花找到一个图例 但也想为我的产品线提供一个标签 非常感谢 data iris iris gt ggplot aes x Sepal Length y Sepa
  • Django modelformset_factory 删除标记为删除的模型表单

    使用 modelformset factory 时 如何从数据库中删除表单中标记为删除的对象 我像这样创建 modelformset factory ItemFormset modelformset factory Item ItemMod
  • 为什么需要这么长时间才能匹配?这是一个错误吗?

    我需要匹配 Web 应用程序中的某些 URL 即 123 456 789 并编写此正则表达式来匹配模式 r d 我注意到 即使在测试模式几分钟后 它似乎也没有进行评估 re findall r d 12345121 223456 12312
  • 纯CSS连续水平文本滚动不中断

    我正在尝试创建一个带有水平文本的新闻滚动条 该文本连续滚动 循环之间不会中断 理想情况下 解决方案是纯 css html 但我不知道这是否可能 到目前为止 这是我的初步尝试 http jsfiddle net lgants ncgsrnza
  • 默认关闭 HTML5 视频的隐藏式字幕

    这就是我所拥有的
  • 使用 CSS 将边框半径应用于滚动条

    简单地说 这就是我想要的 使用 Webkit 浏览器获得 webkit 滚动条 这就是我在 Opera 上得到的结果 Firefox 也不将边框半径应用于滚动条 但仍然应用边框 有没有一种简单的方法可以使滚动条下的边框不消失 我不需要花哨的
  • Bootstrap:带有键盘控件的轮播

    有人能够用键盘控制实现 Twitter Bootstrap 轮播吗 我知道这将在下一个版本中实现 但现在我想知道你们中是否有人能够使其工作 这是我当前的代码
  • jQuery .rotate() 不起作用

    我不知道为什么它不起作用 我正在使用 jQuery 2 1 0 我有这个代码 a shownav img rotate 180 我怎样才能让它发挥作用without使用插件 用于使用 rotate 你需要添加jquery旋转 https c
  • 使用 Java 反射查找最匹配的 writeMethod

    Commons BeanUtils getMatchingAccessibleMethod 找到匹配项 但不是最佳匹配项 考虑这个简单的例子 public class TestReflection extends TestCase publ
  • 最新 Chrome/V8 版本中的对象描述符 getter/setter 性能

    Given var obj var a 1 obj a 1 obj aGetter function return a obj aSetter function val a val Object defineProperty obj a e