Post-call/runtime Object.defineProperty 的性能影响
Post-call/runtime performance implications of Object.defineProperty
如果在脚本的加载阶段,使用 Object.defineProperty、Object.defineProperties 或 Object.create 定义了许多属性。大多数描述符要么是不可写的(如果不是访问器)、不可配置的、不可枚举的,要么是它们的组合。相对于常规赋值或对象初始化,被动性能差异(如果有)和访问目标属性的性能差异是什么?
听说定义不可写的and/or不可配置的属性涉及设置保护以防止写入and/or重新定义将是性能损失的一个原因,这是真的吗?
定义示例:
Object.defineProperty(window, 'foo', {
configurable: false,
enumerable: false,
writable: false,
value: 10
});
使用 Object.defineProperty/defineProperties 创建属性肯定比简单地分配它们要慢。 (多少?取决于。测量!使基准测试相关的最佳方法是使它们与您感兴趣的实际用例尽可能相似。理想情况下,您测量实际生产代码的不同版本。)
无论 属性 是如何定义的,读取属性的速度都是一样的。
写入现有属性必须始终检查可写性,正是因为它无法知道是否使用了 foo.bar = baz
或 Object.defineProperty(foo, "bar", {value: baz})
。所以这也是相同的速度。
没有特警。
如果在脚本的加载阶段,使用 Object.defineProperty、Object.defineProperties 或 Object.create 定义了许多属性。大多数描述符要么是不可写的(如果不是访问器)、不可配置的、不可枚举的,要么是它们的组合。相对于常规赋值或对象初始化,被动性能差异(如果有)和访问目标属性的性能差异是什么?
听说定义不可写的and/or不可配置的属性涉及设置保护以防止写入and/or重新定义将是性能损失的一个原因,这是真的吗?
定义示例:
Object.defineProperty(window, 'foo', {
configurable: false,
enumerable: false,
writable: false,
value: 10
});
使用 Object.defineProperty/defineProperties 创建属性肯定比简单地分配它们要慢。 (多少?取决于。测量!使基准测试相关的最佳方法是使它们与您感兴趣的实际用例尽可能相似。理想情况下,您测量实际生产代码的不同版本。)
无论 属性 是如何定义的,读取属性的速度都是一样的。
写入现有属性必须始终检查可写性,正是因为它无法知道是否使用了 foo.bar = baz
或 Object.defineProperty(foo, "bar", {value: baz})
。所以这也是相同的速度。
没有特警。