为什么在JavaScript中,使用.call和.apply比直接函数调用要慢?

24
我对这些jsperf结果很感兴趣。它们似乎表明,直接调用函数比使用.call.apply调用相同的函数要快得多。(我更惊讶的是.call.apply之间的差异。) 你能否解释一下这些结果?
更新:这里有一个jsperf测试了.apply而没有第二个数组实例化:点击这里

6
首先,至少还涉及一个函数调用(调用“.call()”或“.apply()”)... - Pointy
2
实际上,使用 ".call()" 或 ".apply()" 的速度大约只有一半左右,这正是你期望的代价,相当于执行两个函数调用而不仅仅是一个。 - Pointy
8
.apply 的速度较慢是因为你同时构造了一个数组。 - pimvdb
2
@Pointy,这是一个不错的经验性解释,但是根据Yehuda Katz的说法,function.call()obj.func()应该被解析为相同的内部调用[[Call]]。因此,无论哪种方式,都只应该有一个调用。 - kojiro
iPad 上,applycall 的性能是相同的。 - viebel
1个回答

7

我猜原因可能取决于您正在运行代码的解释器,但似乎普通函数调用更快,因为解释器可以使用内联缓存来访问属性。

您可以在这里查看更多信息。


如果你运行这个[test][1],你会注意到.call和普通的call一样快,可能是因为解释器在数组包含不同类型的值时难以进行类型推断... - F-A
“the interpreter can use Inline Cache to access the properties”这句话是什么意思:指的是哪些属性? - viebel
我指的是对象属性。在javascript中调用obj.myProp时,解释器需要循环遍历对象中的所有属性以检查哪个属性对应于“myProp”。其中一种可能的优化是“记住”该属性在对象属性列表中的索引,并在下次函数调用时直接跳转到该属性。 - F-A
链接到http://blog.mozilla.com/dmandelin/2011/06/16/know-your-engines-at-oreilly-velocity-2011/已经失效。 - Alice Oualouest
是的,现在似乎出了问题。我模糊地记得它指向了David Mandelin的演示文稿。从链接名称中,您可能可以在此处找到相同的材料:https://conferences.oreilly.com/velocity/velocity2011/public/schedule/detail/18087(无论如何,此链接的pdf与答案相关)。 - F-A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接