【问题标题】:Post-call/runtime performance implications of Object.definePropertyObject.defineProperty 的调用后/运行时性能影响
【发布时间】:2017-03-21 14:09:16
【问题描述】:

如果在脚本的加载阶段,许多属性是使用 Object.defineProperty、Object.defineProperties 或 Object.create 定义的。大多数描述符要么是不可写的(如果不是访问器)、不可配置、不可枚举或组合。相对于常规赋值或对象初始化,如果有的话,被动性能差异和访问目标属性的性能差异是什么?

我听说定义不可写和/或不可配置属性涉及设置保护以防止写入和/或重新定义将是性能损失的原因之一,这是真的吗?

定义示例:

Object.defineProperty(window, 'foo', {
    configurable: false,
    enumerable: false,
    writable: false,
    value: 10
});

【问题讨论】:

  • 我认为只有基准测试才能判断。
  • @Bergi 但考虑到 JavaScript 中的一些麻烦,没有进行基准测试,因为性能高度依赖于上下文,你不应该假设在少数情况下的性能,因为 JIT 会进行复杂的优化或类似的事情?
  • 是的。 defineProperty 会影响这些优化 - 我们在讨论性能时不能忽视它们。
  • @Bergi 这种影响对性能的影响程度是否已知?或者是否有任何相对简单的方法来衡量这种影响,但不是针对特定案例,而是主要针对一般情况?

标签: javascript performance ecmascript-6 v8


【解决方案1】:

使用 Object.defineProperty/defineProperties 创建属性肯定比简单地分配属性要慢。 (多少?取决于。衡量!使基准相关的最佳方法是使它们与您感兴趣的实际用例尽可能相似。理想情况下,您衡量实际生产代码的不同版本。)

无论属性是如何定义的,读取属性的速度都是一样的。

写入现有属性必须始终检查可写性,正是因为它无法知道使用的是foo.bar = baz 还是Object.defineProperty(foo, "bar", {value: baz})。所以速度也是一样的。

没有特别的守卫。

【讨论】:

  • 关于使用方法创建属性,我已阅读:nczonline.net/blog/2015/11/… 但不确定您答案的后半部分;假设你是对的,这真的澄清了属性是如何工作的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 2013-03-09
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多