__ icon indicating copy to clipboard operation
__ copied to clipboard

call和apply的性能对比

Open noneven opened this issue 9 years ago • 7 comments

以前看jQuery源码的时候有看到在源码的注释中有些过call的性能会比apply好,在lodash的源码中也同样的发现有call比apply性能更好的注释,这里我在jsperf上写了几个test case,验证了一下确实call比apply的性能更好。

  • 0、lodash源码apply方法重写
  • 1、无指向无参数对比:
  • 2、有指向无参数对比:
  • 3、无参数有指向:
  • 4、有参数有指向对比:

总结: 在我们平时的开发中其实不必关注call和apply的性能问题,但是可以尽可能的去用call,特别是es6的reset解构的支持,call基本可以代替apply,可以看出lodash源码里面并没有直接用Function.prototype.apply,而是在参数较少(1-3)个时采用call的方式调用(因为lodash里面没有超过4个参数的方法,PS如果一个函数的设计超过4个入参,那么这个函数就要考虑重构了)

转载请注明出处

noneven avatar Oct 25 '16 03:10 noneven

这是用什么工具测试的

以前看jQuery源码的时候有看到在源码的注释中有些过call的性能会比apply好,在lodash的源码中也同样的发现有call比apply性能更好的注释,这里我在jsperf上写了几个test case,验证了一下确实call比apply的性能更好。

  • 0、lodash源码apply方法重写
  • 1、无指向无参数对比:
  • 2、有指向无参数对比:
  • 3、无参数有指向:
  • 4、有参数有指向对比:

总结: 在我们平时的开发中其实不必关注call和apply的性能问题,但是可以尽可能的去用call,特别是es6的reset解构的支持,call基本可以代替apply,可以看出lodash源码里面并没有直接用Function.prototype.apply,而是在参数较少(1-3)个时采用call的方式调用(因为lodash里面没有超过4个参数的方法,PS如果一个函数的设计超过4个入参,那么这个函数就要考虑重构了)

转载请注明出处

这是用什么工具测试的

Been101 avatar Aug 07 '19 14:08 Been101

这是用什么工具测试的

这…人家写了用jsperf

uboa3774 avatar Aug 23 '19 06:08 uboa3774

总结: 在我们平时的开发中其实不必关注call和apply的性能问题,但是可以尽可能的去用call,特别是es6的reset解构的支持,call基本可以代替apply,可以看出lodash源码里面并没有直接用Function.prototype.apply,而是在参数较少(1-3)个时采用call的方式调用(因为lodash里面没有超过4个参数的方法,PS如果一个函数的设计超过4个入参,那么这个函数就要考虑重构了)

函数参数超过3个情况, lodash 源码中统一按照原始的apply处理了,源码 最后一行的 return

CodingYiyi avatar Mar 06 '20 14:03 CodingYiyi

不靠谱!!!!!!

image

yudekai avatar Apr 29 '20 07:04 yudekai

为什么我得到的是相反的结果?call 比 apply 慢 5 倍以上。

const arr= Array.from({ length: 100000 })

console.time('call')
console.log(Array.prototype.push.call([], ...arr))
console.timeEnd('call')

console.time('apply')
console.log(Array.prototype.push.apply([], arr))
console.timeEnd('apply')
$ node call-vs-apply.js
100000
call: 19.790ms
100000
apply: 3.907ms

elixiao avatar Jun 17 '20 09:06 elixiao

为什么我得到的是相反的结果?call 比 apply 慢 5 倍以上。

const arr= Array.from({ length: 100000 })

console.time('call')
console.log(Array.prototype.push.call([], ...arr))
console.timeEnd('call')

console.time('apply')
console.log(Array.prototype.push.apply([], arr))
console.timeEnd('apply')
$ node call-vs-apply.js
100000
call: 19.790ms
100000
apply: 3.907ms

好尴尬,我测试的结果也是apply更快点. 而且跟传入参数个数无关,都是apply更快点.

alan1111 avatar Jun 25 '20 07:06 alan1111

为什么我得到的是相反的结果?call 比 apply 慢 5 倍以上。

const arr= Array.from({ length: 100000 })

console.time('call')
console.log(Array.prototype.push.call([], ...arr))
console.timeEnd('call')

console.time('apply')
console.log(Array.prototype.push.apply([], arr))
console.timeEnd('apply')
$ node call-vs-apply.js
100000
call: 19.790ms
100000
apply: 3.907ms

有点看不懂,不过我把你的长度改成3和10分别拿了100次数据, call都要快一点

daiwiy avatar Jul 06 '20 08:07 daiwiy