我正在循环遍历一个包含数千个项目的数据集。
users.forEach(function(user){
//List ALLTHETHINGS!
listAllEverything(user)
//Add gropings
user.groupings = groupings.filter(function(grouping){
return grouping.conditional(user)
})
//Add conversions to user, one per user.
user.conversions = {}
//for each conversionList
conversionLists.forEach(function(conversionList){
user.conversions[conversionList.name] = [];
//for each conversion
for (var i = conversionList.conversions.length - 1; i >= 0; i--) {
var conversion = conversionList.conversions[i]
//test against each users apilog
var converted = user.apilog.some(function(event){
return conversion.conditional(event);
})
if (converted){
//Lägg till konverteringen och alla konverteringar som kommer innan.
for (var i = i; i >= 0; i--){
user.conversions[conversionList.name].push(conversionList.conversions[i])
}
break;
}
};
})
})
我知道这不是最优化的代码,我有一些想法可以改进它。但我对这些问题很新,所以我不确定应该如何优先考虑。我知道console.time,这很有用,但是我想用一些东西来复合在forEach循环的每个部分上花费的时间,无论是工具(我通常使用chrome)还是一些调试方法。优选地,不会对性能产生太大影响。
答案 0 :(得分:2)
由于您正在使用Chrome,因此请查看浏览器DevTools中的时间轴标签 - 只需在运行循环之前点击记录按钮,并在完成后停止。您将对刚刚发生的所有事情进行详细分析,您将对黄色条形图感兴趣 - 它们会显示JavaScript操作。
请查看此video presentation by Paul Irish about Performance Tooling
如您所知,在Chrome或Firefox中,您只需使用console.time(和console.timeEnd)包装一段代码,它将测量特定操作的速度并将其打印在控制台中。
例如:测量整个循环执行使用所需的时间:
console.time('For loop benchmark');
for(i=0; i<1000; i++) {
// do some operations here
}
console.timeEnd('For loop benchmark');
但是,如果要测量每次迭代,可以参数化循环内的日志名称,以便您可以按照自己的方式命名每个特定操作:
for(i=0; i<1000; i++)
var consoleTimeName = 'Measuring iteration no '+i+' which is doing this and that...';
console.time(consoleTimeName);
// do some operations here
console.timeEnd(consoleTimeName);
}
使用它,你可以自己看看 循环的简单可以与jQuery的 $。每个循环相比更快。
您可以在developer.mozilla.org和developer.chrome.com上找到有关此内容的更多信息。请注意,这是一个标准化的跨浏览器兼容功能,您不应该在生产网站上使用它,因为像IE这样的浏览器在看到它时可能会给您一个错误。