javascript - 吸气函数的速度与直接访问

标签 javascript performance getter

我最近开始使用更多的 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/

相关文章:

javascript 使用函数作为变量(getter)

java - 将数据从类传递到 Activity

javascript - Node.js 与 Express : Change response data for certain path

javascript - Sequelize : Using include in a model that represents an association table between two other models

javascript - Nodejs 哈巴狗扩展

javascript - 当属性名称等于搜索值时出现错误结果

javascript - Angular 中虚拟列表的性能优化

java - 有多少种方法可以解决java中的堆空间问题?

javascript - 如何测量谷歌地图的加载时间

javascript - 检测是否通过 getter 查看图像(在控制台中)