测量一个慢的循环部分?

时间:2014-12-11 22:51:49

标签: javascript performance

我正在循环遍历一个包含数千个项目的数据集。

    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)还是一些调试方法。优选地,不会对性能产生太大影响。

1 个答案:

答案 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.orgdeveloper.chrome.com上找到有关此内容的更多信息。请注意,这是一个标准化的跨浏览器兼容功能,您不应该在生产网站上使用它,因为像IE这样的浏览器在看到它时可能会给您一个错误。