最快的JavaScript总结

Jos*_*h K 63 javascript arrays function

在JavaScript中总结数组的最快方法是什么?快速搜索会转换几种不同的方法,但如果可能的话,我想要一个本机解决方案.这将在SpiderMonkey下运行.

在我一直在使用的内部思考:

var count = 0;
for(var i = 0; i < array.length; i++)
{
    count = count + array[i];
}
Run Code Online (Sandbox Code Playgroud)

我确信有更好的方法然后直接迭代.

Cha*_*ion 123

你应该可以使用reduce.

var sum = array.reduce(function(pv, cv) { return pv + cv; }, 0);
Run Code Online (Sandbox Code Playgroud)

资源

使用ES6中引入的箭头功能,它甚至更简单:

sum = array.reduce((pv, cv) => pv + cv, 0);
Run Code Online (Sandbox Code Playgroud)

  • 与其他方法相比,`Array.reduce`非常慢.http://jsperf.com/array-reduce-vs-foreach/2 (29认同)
  • 不知怎的,我怀疑它,即使`reduce`是一个原生函数.在JS中的性能导向代码中,避免函数调用几乎总是更快, (10认同)
  • ......除了IE <= 8. (5认同)
  • @BrunoLM这不再是真的! (2认同)

vol*_*ron 30

改进


您的循环结构可以更快:


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

这将检索array.length一次,而不是每次迭代.通过缓存值来进行优化.


如果你真的想加快它:


   var count=0;
   for (var i=array.length; i--;) {
     count+=array[i];
   }
Run Code Online (Sandbox Code Playgroud)

这相当于一段时间的反向循环.它缓存该值并与0进行比较,从而加快迭代速度.

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


比较结构

我开始使用 JSPerf进行数组求和.它很快被构建,并不能保证完整或准确,但这就是编辑的目的:)

  • 你的`for`循环几乎相等.我测试过,有时候增量方式比减少方式更快.并且Array.reduce非常慢.http://jsperf.com/array-reduce-vs-foreach/2 (3认同)

Ink*_*sou 20

在寻找对数组求和的最佳方法时,我写了一个性能测试.

在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");
Run Code Online (Sandbox Code Playgroud)

评分:5233.000ms

循环:255.000ms

减少:70.000ms

while:214.000ms

  • 谢谢你,为什么在reduce函数中需要有一个“parseInt”?我尝试过,我的代码中也需要它。 (3认同)

Kod*_*ice 6

否则您可以用邪恶的方式做到这一点。

var a = [1,2,3,4,5,6,7,8,9];

sum = eval(a.join("+"));
Run Code Online (Sandbox Code Playgroud)

;)

  • 永远不应该使用 eval() (3认同)

Caf*_*eek 5

根据这个测试,最快的循环是反向循环

var i = arr.length; while (i--) { }
Run Code Online (Sandbox Code Playgroud)

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

Array.prototype.sum = function () {
    var total = 0;
    var i = this.length; 

    while (i--) {
        total += this[i];
    }

    return total;
}
Run Code Online (Sandbox Code Playgroud)

Array.prototype.sum 将sum方法添加到数组类中......您可以轻松地将其作为辅助函数.