[英]JavaScript performance: Call vs Apply
当params
为空数组或null
时func.apply(obj, params)
从func.apply(obj, params)
切换到func.call(obj)
是否有性能优势?
我的意思是,调用func.call(obj)
比调用func.apply(obj, null)
更快?
我最感兴趣的是NodeJS 4.x下的性能。
这适用于必须进行大量此类调用的算法。
在这个页面上有一个比较。 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,则抛出TypeError异常。
- 如果argArray为null或未定义 ,那么
- 返回调用func的[[Call]]内部方法的结果,提供thisArg作为此值和一个空的参数列表。
Function.prototype.call( thisArg [, arg1 [, arg2 ,...]])
- 如果IsCallable ( func )为false ,则抛出TypeError异常。
- 让argList为空List 。
- 如果使用多个参数调用此方法, 则从 arg1开始以从左到右的顺序将每个参数附加为argList的最后一个元素
- 返回调用func的[[Call]]内部方法的结果,提供thisArg作为此值,并将argList作为参数列表。
因此差异(如果有的话)应该依赖于实现,并且可以忽略不计。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.