Q1。我想确认以下代码的版本1是否比版本2更有效?我想知道将来参考,所以我将根据V1或V2的样式编写代码。
Q2。如何衡量代码的效率? (不必深入,我只是想有一个粗略的想法)
版本1:
function average(array) {
return array.reduce(function(a,b) { return a + b; }) / array.length;
}
第2版:
function average(array) {
function plus(a,b) { return a + b; }
return array.reduce(plus) / array.length;
}
编辑:假设在稍后阶段我会编写更复杂的代码,我想养成现在编写高效代码的习惯。我知道,对于简单的单行,没有明显的区别。
答案 0 :(得分:1)
从大O角度来看,这些功能同样有效。它们相同的原因是它们都将函数传递给reduce()
(函数声明的方式不同,但它是相同的底层结构,因此效率相同)。其他功能相同。如果我是你,我会选择第二种情况,因为它可能更容易维护。
如果你愿意,你可以使用速度测试,但老实说这是浪费你的时间,因为这两种方法是相同的。
答案 1 :(得分:1)
使用顺序循环,速度要快得多: http://jsperf.com/anonymous-vs-named-function-passing/2
function average3(array) {
var sum =0;
for( var i=0, len=array.length; i< len; i++ )
sum+=array[i];
return sum/array.length;
}
答案 2 :(得分:0)
您将获得相同的结果。或者差异可以忽略不计。取决于JS引擎以及它的优化器有多好。
正如其他人建议您可以使用jsperf.com进行速度测试。
但如果你真的关心表现,请在这里查看第三个案例 http://jsperf.com/anonymous-vs-named-function-passing/3
答案 3 :(得分:0)
它们是相同的......但你可以通过避免创建sum函数的新闭包来进行优化。
function sum(a,b){
return a+b;
}
function average(array){
return array.reduce(sum) / array.length;
}
这样sum在其上下文中不会引用array
;并且不需要与上下文相加的新实例。请记住,即使您不使用这些参数,闭包也会保存包含它的函数的参数的引用。
这意味着每次调用sum
时都不会实例化新函数average
。