forEach函数比循环的等效函数快得多

时间:2015-06-26 12:35:21

标签: javascript angularjs performance for-loop foreach

在我正在构建的Angular应用程序中,我有两段代码可以在每次刷新时触发。它们都做同样的事情,但更快的是每个函数的数组,我认为它应该稍微

如果发现错误,太棒了!但为什么foreach循环要快得多。它们是紧接着的,如果我改变顺序,它就不会有所作为。

首先是速度越快。使用performance.now()平均大约5毫秒。

var start = performance.now();
start = performance.now();
$scope.config.formTables.forEach(function (e, i, a) {
    ['tbody', 'thead', 'tfoot'].forEach(function (f, j) {
        if (!$scope.config[e][f]) return;
        $scope.config[e][f].forEach(function (g, k) {
            if(isFunction(g.calculated || {})) g.calculated.apply(g);
        })
    })
});
console.log(performance.now() - start);  

现在是较慢的一个,我认为应该更快。这个需要100-200毫秒。

start = performance.now();
var i,j,k,e,f,g;
for(i = 0; i < $scope.config.formTables.length; i++){
    e = $scope.config[$scope.config.formTables[i]];
    if(e.thead)
    for(j = 0; j < e.thead.length; j++){
        f = e.thead;
        for(k = 0; k < f.length; k++){
            //g = f[j];
            if(isFunction(f[j].calculated || {})) f[j].calculated.apply(f[j]);
        }
    }
    if(e.tfoot)
    for(j = 0; j < e.tfoot.length; j++){
        f = e.tfoot;
        for(k = 0; k < f.length; k++){
            //g = f[j];
            if(isFunction(f[j].calculated || {})) f[j].calculated.apply(f[j]);
        }
    }
    if(e.tbody)
    for(j = 0; j < e.tbody.length; j++){
        f = e.tbody;
        for(k = 0; k < f.length; k++){
            //g = f[j];
            if(isFunction(f[j].calculated || {})) f[j].calculated.apply(f[j]);
        }
    }
}
console.log(performance.now() - start);

1 个答案:

答案 0 :(得分:1)

不,它们不等同,因为这一点:

for(j = 0; j < e.thead.length; j++){
    f = e.thead;
    for(k = 0; k < f.length; k++){
        //g = f[j];
        if(isFunction(f[j].calculated || {})) f[j].calculated.apply(f[j]);
    }
}

在这里你基本上重复两次相同的事情,嵌套会杀死性能。只要省略其中一个循环 - 您也可能会注意到您从未在循环体中使用k

应该只是

if(e.thead) {
    f = e.thead;
    for(k = 0; k < f.length; k++){
        //g = f[j];
        if(isFunction(f[k].calculated || {})) f[k].calculated.apply(f[k]);
    }
}

请注意,您f == "thead"版本中从不使用jforEach

你真的应该使用更多的描述性变量名称,那么像这样的事情会更加明显。 ef在两个版本中也不是同义词。