【发布时间】:2018-02-20 20:05:02
【问题描述】:
我有一个长期的假设,即深度 prototype chains 会导致属性访问器的性能下降。我试图在 hide the getter or add in the proto Object 上解释这一点,但快速的 benchmark I threw together 导致的结果与我的预期完全相反。
这里发生了什么?我是否遗漏了一些明显的东西,或者这是否完全表明我(和其他人)对prototype 链上属性访问器性能的假设是错误的?
设置
const object1 = {
foo: 'Hello, World!',
get bar () { return this.foo }
};
const object2 = Object.assign(Object.create({
get bar () { return this.foo }
}), {
foo: 'Hello, World!'
});
let result;
测试 1
(控制,没有prototype)
result = object1.bar;
测试 2
(实验,prototype)
result = object2.bar;
结果
测试 1 的运行速度比测试 2 慢 92.85%,这意味着将 get bar () {} 放在 prototype 链中而不是放在对象自身的属性中会导致属性访问器的速度提高 14 倍。请参阅Object.create() 了解对象的布局有何不同。
测试 1
79,323,722 次操作/秒 ±0.34%
测试 2
1,108,762,737 次操作/秒 ±0.15%
使用 Google Chrome 63.0.3239.132(官方版本)(64 位)在 Windows 10 Intel i7-7700K CPU @ 4.20GHz 上测试
【问题讨论】:
-
(FWIW,基准测试在 Firefox 60 中两者之间没有区别。18 亿次操作/秒与 Chrome 64 的 60 和 8.9 亿次操作/秒)
-
运行时可以随意折叠链。
-
@Pointy 当然,但这并不能解释为什么它更快而不是可比。
-
@Akxe:该链接指向导致性能变化的补丁,而不是有关命中的错误报告。
标签: javascript performance optimization prototype getter