在我正在构建的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);
答案 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"
版本中从不使用j
和forEach
。
你真的应该使用更多的描述性变量名称,那么像这样的事情会更加明显。 e
和f
在两个版本中也不是同义词。