【问题标题】:Really weird object creation JS benchmark真正奇怪的对象创建 JS 基准测试
【发布时间】:2014-01-25 11:46:07
【问题描述】:

我做了一个简单的对象创建基准。我知道“有谎言,该死的谎言和基准”,但是差异似乎很大。 谁能告诉我我做错了什么。或者如果没有,怎么可能? 我是JS新手,请不要打我。

http://jsperf.com/factoryvsconstvsobjectcreate/3

/编辑感谢 Andrew Fedoniouk 的小错误修复

【问题讨论】:

  • 我相信您的测试用例不正确 - 不清楚您在那里测量的内容。这是对象创建的测试测量速度:jsperf.com/factoryvsconstvsobjectcreate/4
  • @c-smile 您的测试有错误。每次在工厂中将返回值分配给 obj。毕竟。我想测量整个模式,而不仅仅是它的对象创建。
  • 是的,然后检查jsperf.com/factoryvsconstvsobjectcreate/5。我想说,文字创建和构造函数创建之间的区别是微不足道的。作为整个模式测试,我认为它不实用。通常类/工厂声明只发生一次 - 在启动时。
  • 你是对的。有谁知道它如何代表记忆?
  • 有趣的是,即使在您的测试中也存在差异。但也许这就是工作 instanceof 和其余部分的代价。

标签: javascript performance object constructor object-construction


【解决方案1】:

Factory 和 Constructor 测试之间的巨大差异是由于后者执行了一系列额外的步骤。

当函数作为构造函数被调用时,its [[Construct]] internal method is invoked,这很可能是导致性能差异的原因。查看[[Construct]]中涉及的所有步骤:

1。设 obj 为新创建的原生 ECMAScript 对象。

2。按照8.12中的规定设置obj的所有内部方法。

3。将 obj 的 [[Class]] 内部属性设置为“Object”。

4。将 obj 的 [[Extensible]] 内部属性设置为 true。

5。令 proto 为使用参数“prototype”调用 F 的 [[Get]] 内部属性的值。

6。如果 Type(proto) 为 Object,则将 obj 的 [[Prototype]] 内部属性设置为 proto。

7。如果 Type(proto) 不是 Object,则将 obj 的 [[Prototype]] 内部属性设置为 15.2.4 中描述的标准内置 Object 原型对象。

8。令 result 为调用 F 的 [[Call]] 内部属性的结果,提供 obj 作为 this 值,并提供传入 [[Construct]] 的参数列表作为 args。

9。如果 Type(result) 是 Object 则返回结果。

10。返回 obj。

【讨论】:

  • 为了完整起见,还应该列出工厂案例中涉及的步骤。您会感到惊讶,但在这两种情况下,这些步骤几乎相同。
  • @c-smile 我的观点是工厂方法只调用[[call]],而构造方法调用[[construct]],而后者又在第8步调用[[call]] . 所以有开销。
  • 我很想看看new Constructor()factory()Object.create(...) 的结果,因为您在每个测试中都有几行代码来进行设置。您真正感兴趣的是事物的对象生成部分。
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 2023-01-29
  • 2013-11-22
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2015-10-21
  • 2019-07-18
相关资源
最近更新 更多