最快的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("+"));
;)