在 JavaScript 中总结数组的最快方法是什么?快速搜索会转换几种不同的方法,但如果可能的话,我想要一个本机解决方案。这将在 SpiderMonkey 下运行。
我一直在使用的非常内在的思考:
var count = 0;
for(var i = 0; i < array.length; i++)
{
count = count + array[i];
}
我确信有比直接迭代更好的方法。
在 JavaScript 中总结数组的最快方法是什么?快速搜索会转换几种不同的方法,但如果可能的话,我想要一个本机解决方案。这将在 SpiderMonkey 下运行。
我一直在使用的非常内在的思考:
var count = 0;
for(var i = 0; i < array.length; i++)
{
count = count + array[i];
}
我确信有比直接迭代更好的方法。
var count = 0;
for(var i=0, n=array.length; i < n; i++)
{
count += array[i];
}
这检索array.length
一次,而不是每次迭代。优化是通过缓存值进行的。
var count=0;
for (var i=array.length; i--;) {
count+=array[i];
}
这相当于一个while反向循环。它缓存该值并与 0 进行比较,从而加快迭代速度。
有关更完整的比较列表,请参阅我的JSFiddle。
注意: array.reduce 在那里很糟糕,但在 Firebug 控制台中它是最快的。
我开始了一个用于数组求和的 JSPerf。它是快速构建的,不能保证完整或准确,但这就是编辑的目的:)
在寻找对数组求和的最佳方法时,我编写了一个性能测试。
在 Chrome 中,“减少”似乎要优越得多
我希望这有帮助
// 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.000 毫秒
减少:70.000 毫秒
同时:214.000 毫秒
或者你可以用邪恶的方式来做。
var a = [1,2,3,4,5,6,7,8,9];
sum = eval(a.join("+"));
;)
最快的循环,根据这个测试是反向的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 方法添加到数组类中……您可以轻松地将其设为辅助函数。