最近,我开始使用更多的getter函数,而不是直接访问以使我的代码更灵活。我很好奇这在速度方面的代价。假设earth是一个对象,并且我们有以下父对象:

var star={}
star.planet=earth
star.getPlanet=function(){
  return this.planet
}

以下两个语句之间的速度差异是否可以忽略不计?
print(star.planet)
print(star.getPlanet())

最佳答案

在V8中:

如此短且没有上下文分配变量的函数将被内联。当然,除非已经积累了太多的内联,否则在这种情况下调用仍然非常便宜,因为函数的整个执行部分都位于64字节的指令高速缓存行中。

当函数在严格模式下使用例如arguments或定义引用函数变量的内部函数时,会发生上下文分配的变量。另一个问题是,如果调用方和被调用方不能共享相同的上下文,则无法内联x64函数,因此总而言之,请避免像瘟疫这样的闭包。

请参阅:http://jsperf.com/312319sakd,尽管它看起来像firefox使用了死代码消除功能(这令人沮丧,因为为什么浪费时间这样做?)。

奖励:this jsperf故意使当前V8中的getter函数不可插入(通过巨大的注释,这会使函数大小的启发式方法失败)。您可以看到,即使没有内联函数,它仍然比直接引用prop慢25%。

请注意,当无法内联函数时,它将被视为黑匣子,其副作用对于调用函数是未知的,因此速度对代码高度敏感。

09-11 19:05
查看更多