gpt4 book ai didi

javascript - 在这种情况下,扩展原型(prototype)链如何提高性能?

转载 作者:数据小太阳 更新时间:2023-10-29 03:55:26 25 4
gpt4 key购买 nike

我长期以来一直认为深 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 上测试

最佳答案

据我所知,这些细节仅适用于 V8 引擎,我不确定这如何直接映射到 Firefox 的实现。

如果没有原型(prototype),V8 会创建隐藏类来支持对象的属性。对于每个新属性,都会创建一个新的隐藏类,然后创建从前一个隐藏类到新隐藏类的转换。

但是,这不会发生在原型(prototype)上,这是我就该主题进行的对话中鲜为人知的事实。换句话说,是的,原型(prototype)更快。

To optimize prototypes, V8 keeps track of their shape differently from regular transitioning objects. Instead of keeping track of the transition tree, we tailor the hidden class to the prototype object, and always keep it fast -Toon Verwaest (V8 dev)

此设置全部发生在 Dynamic Machine Code Generation 期间.您看到的两种设置之间的区别是更复杂的隐藏类路径与更自定义的路径之间的区别。或者,顾名思义,fastPropertiesWithPrototype对象和slowProperties对象的区别,后者使用字典模式。

关于javascript - 在这种情况下,扩展原型(prototype)链如何提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48893360/

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