noneven/__

call和apply的性能对比

Opened this issue · 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个入参,那么这个函数就要考虑重构了)

转载请注明出处

这是用什么工具测试的

以前看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个入参,那么这个函数就要考虑重构了)

转载请注明出处

这是用什么工具测试的

这是用什么工具测试的

这…人家写了用jsperf

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

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

不靠谱!!!!!!

image

为什么我得到的是相反的结果?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

为什么我得到的是相反的结果?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更快点.

为什么我得到的是相反的结果?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都要快一点