为什么较长的继承链在我的jsperf测试中需要更长的时间

时间:2015-01-14 21:37:13

标签: javascript performance prototype performance-testing

我试图看看长继承链的性能成本是多少,所以我设置了一个jsperf测试: http://jsperf.com/prototype-inheritance-chain-cost

以下是设置代码:

Person = function (name) {this.name = name}
Person.prototype.title = function () {
return this.name
}
kinds = {"-1": Person};
instances = {"-1": new Person("john")}
for (var i = 0; i < 10; i++) {
  kinds[i] = function (name) {this.name = name};
  kinds[i].prototype = new kinds[i-1];
  kinds[i].prototype[i] = function () {
    return this.name
  }
  instances[i + ''] = new kinds[i]("john")
}
test = function (i) {
  instances[i].title();
}

以及两个测试用例:

test("-1")

test(5)

然而,第一次测试的时间要长一个数量级。我相当肯定第一次测试应该更快,因为它不必遍历继承链。

1 个答案:

答案 0 :(得分:0)

答案非常简单,instance[i]功能访问test所需的时间比访问title()时要长。

为了修复测试,我用两个变量替换了测试函数:

instanceOne = instances["-1"]
instanceFive = instances["5"]

然后两个测试用例很简单:

instanceOne.title()

instanceFive.title()

结果如您所料:

没有继承链 - 762,760,656 - 最快 5个父母 - 717,293,580 - 慢6%