最快的JavaScript总和

什么是在JavaScript中总结数组的最快方法? 快速search可以找出几种不同的方法 ,但如果可能的话,我想要一个本机解决scheme。 这将在SpiderMonkey下运行。

我一直在使用:

var count = 0; for(var i = 0; i < array.length; i++) { count = count + array[i]; } 

我确定有一个更好的方法,然后直接迭代。

你应该可以使用reduce

 var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0); 

资源

而ES6引入的箭头function更简单:

 sum = array.reduce((pv, cv) => pv+cv, 0); 

改进

你的循环结构可以做得更快:


  var count = 0; for(var i=0, n=array.length; i < n; i++) { count += array[i]; } 

这一次检索array.length ,而不是每次迭代。 优化是通过caching值进行的。

如果你真的想加快速度:


  var count=0; for (var i=array.length; i--;) { count+=array[i]; } 

这相当于一个反向循环。 它caching该值并将其与0进行比较,从而更快地进行迭代。

有关更完整的比较列表,请参阅我的JSFiddle
注意: array.reduce在那里很糟糕,但是在Firebug Console中它是最快的。


比较结构

我开始了一个JSPerf数组求和。 它被迅速构build,并不能保证是完整的或准确的,但这是编辑的目的:)

在寻找最好的数组求和方法时,我写了一个性能testing。

在Chrome中,“减less”似乎是非常优越的

我希望这有帮助

 // Performance test, sum of an array var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var result = 0; // Eval console.time("eval"); for(var i = 0; i < 10000; i++) eval("result = (" + array.join("+") + ")"); console.timeEnd("eval"); // Loop console.time("loop"); for(var i = 0; i < 10000; i++){ result = 0; for(var j = 0; j < array.length; j++){ result += parseInt(array[j]); } } console.timeEnd("loop"); // Reduce console.time("reduce"); for(var i = 0; i < 10000; i++) result = array.reduce(function(pv, cv) { return pv + parseInt(cv); }, 0); console.timeEnd("reduce"); // While console.time("while"); for(var i = 0; i < 10000; i++){ j = array.length; result = 0; while(j--) result += array[i]; } console.timeEnd("while"); 

评估:5233.000毫秒

循环:255.000ms

减less:70.000ms

而:214.000毫秒

最快的循环,根据这个testing是一个反向的while循环

 var i = arr.length; while (i--) { } 

所以,这个代码可能是你能得到的最快的

 Array.prototype.sum = function () { var total = 0; var i = this.length; while (i--) { total += this[i]; } return total; } 

Array.prototype.sum为数组类添加一个sum方法…您可以轻松地将其作为帮助函数。

对于你的具体情况,只需使用数组的reduce方法:

 var sumArray = function() { // Use one adding function rather than create a new one each // time sumArray is called function add(a, b) { return a + b; } return function(arr) { return arr.reduce(add); }; }(); alert( sumArray([2, 3, 4]) ); 

基于这个testing(for-vs-forEach-vs-reduce)和这个(loops)

我可以这样说:

1#最快:for循环

 var total = 0; for (var i = 0, n = array.length; i < n; ++i) { total += array[i]; } 

2#聚合

对于你来说,你不会需要这个,但它增加了很多的灵活性。

 Array.prototype.Aggregate = function(fn) { var current , length = this.length; if (length == 0) throw "Reduce of empty array with no initial value"; current = this[0]; for (var i = 1; i < length; ++i) { current = fn(current, this[i]); } return current; }; 

用法:

 var total = array.Aggregate(function(a,b){ return a + b }); 

不确定的方法

然后来每个和reduce具有几乎相同的性能,从浏览器到浏览器,但他们有最差的performance。

其中最简单,最快速,更可重用和灵活的是:

 Array.prototype.sum = function () { for(var total = 0,l=this.length;l--;total+=this[l]); return total; } // usage var array = [1,2,3,4,5,6,7,8,9,10]; array.sum() 

或者你可以做到这一点邪恶的方式。

 var a = [1,2,3,4,5,6,7,8,9]; sum = eval(a.join("+")); 

;)