我最近开始使用更多的 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%。
请注意,当一个函数不能被内联时,它被认为是一个黑盒,调用函数不知道其副作用,因此速度对代码上下文高度敏感。
关于javascript - 吸气函数的速度与直接访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18838514/