各种迭代器性能差异的原因

时间:2014-04-28 23:05:40

标签: javascript arrays performance iterator difference

在使用 JavaScript 的新数组函数时,我在以下代码中看到了一些主要的性能差异: jsfiddle:http://jsfiddle.net/jKUm5/

最慢​​for var i in array(67.2ms):

for (var a=0;a<amount;a++) {
    for (var b in arr) {
        arr[b]++;
    }
}

JS 5.1 array.forEach(2.1ms):

for (var c=0;c<amount;c++) {
    arr.forEach(function(e,i,a) {
        arr[i]++;
    });
}

最快(默认)for var i=0;i<array.length;i++(1.1毫秒):

for (var d=0;d<amount;d++) {
    for (var e=0;e<arr.length;e++) {
        arr[e]++;
    }
}

我认为使用for var i in array代替默认值是一个好习惯,但似乎默认是最快的!

我的主要问题是:

  • for var i in array
  • 表现不佳的原因是什么?
  • 默认迭代器和新迭代器有什么区别(使用另一个迭代器方法的必要性是什么?)

1 个答案:

答案 0 :(得分:1)

for-in循环迭代对象的所有属性,而不仅仅是数组值。因此,它必须从对象中检索那些属性值,而不是像其他两个方法一样制造数组索引。除了迭代数组的错误方法之外,它并不让我感到惊讶的是它更慢。但无论速度如何,迭代数组的方法都是错误的。如果有人向Array原型添加了可迭代的方法或属性,那么该属性将显示在for-in数组迭代中。

.forEach()是为了方便起见,有时回调创建的闭包很方便(特别是当你想在异步回调中访问数组索引时)。它可能更慢,因为它涉及一个带有每个迭代参数的函数调用和第三个方法,每次迭代都没有额外的函数调用。

仅供参考,.forEach()方法是Firefox中三个中最慢的方法,所以这也因浏览器而异。