JavaScript性能:通话与应用
当params
是一个空数组或null
时func.apply(obj, params)
从func.apply(obj, params)
切换到func.call(obj)
是否有性能优势?
我的意思是,调用func.call(obj)
比调用func.apply(obj, null)
更快吗?
我最感兴趣的是在NodeJS 4.x下的性能。
这是一个algorithm,必须做很多这样的调用。
在这个页面上有一个比较。 https://jsperf.com/call-apply-segu在我的机器上调用速度更快。
哈,有趣的是:它看起来像apply
比call
慢。 8-)
~/tmp ω cat test.js function work(a, b, c) { // do some work } var a = [1, 2, 3]; for (var j = 0; j < 4; j++) { console.time('apply-ing'); for (var i = 0; i < 1000000; i++) { work.apply(this, a); } console.timeEnd('apply-ing'); console.time('call-ing'); for (var i = 0; i < 1000000; i++) { work.call(this, 1, 2, 3); } console.timeEnd('call-ing'); } ~/tmp ω node test.js apply-ing: 42ms call-ing: 5ms apply-ing: 40ms call-ing: 5ms apply-ing: 42ms call-ing: 5ms apply-ing: 39ms call-ing: 6ms ~/tmp ω node --version v4.1.2 ~/tmp ω
基本上,他们会做同样的步骤:
Function.prototype.apply( thisArg , argArray )
- 如果IsCallable ( func )为false,则引发TypeErrorexception。
- 如果argArray为null或undefined ,那么
- 返callback用func的[[Call]]内部方法的结果,提供thisArg作为这个值和一个空的参数列表。
Function.prototype.call( thisArg [, arg1 [, arg2 ,…]])
- 如果IsCallable ( func )为false ,则引发TypeErrorexception。
- 让argList是一个空列表 。
- 如果使用多个参数调用此方法,则以arg1开始的从左到右的顺序将每个参数作为argList的最后一个元素
- 返callback用func的[[Call]]内部方法的结果,提供thisArg作为这个值, argList作为参数列表。
所以,如果有的话,差异应该取决于实施,而且可以忽略不计。