javascript - js运行机制 - nodejs event loop详解




如何用回调来测量JavaScript代码的执行时间 (8)

我有一段使用node.js解释器执行的JavaScript代码。

for(var i = 1; i < LIMIT; i++){
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
    });
}

我想知道如何测量这些db插入操作所花费的时间。 我可以计算这段代码之前和之后的Date值的差异,但由于代码的异步性质,这可能不正确。


对于任何想要获得时间流逝值而不是控制台输出的人:

使用process.hrtime()作为@ D.Deriso建议,下面是我更简单的方法:

function functionWantToMeasure() {
    var startTime = process.hrtime();
    //do some task...
    var elapsedSeconds = parseHrtimeToSeconds(process.hrtime(startTime));
    console.log('functionWantToMeasure takes ' + elapsedSeconds + 'seconds');
}

function parseHrtimeToSeconds(hrtime) {
    var seconds = (hrtime[0] + (hrtime[1] / 1e9)).toFixed(3);
    return seconds;
}

从AWS转移到Azure时,我遇到同样的问题

对于express和aws,您已经可以使用现有的time()和timeEnd()

对于Azure,使用这个: https://github.com/manoharreddyporeddy/my-nodejs-notes/blob/master/performance_timers_helper_nodejs_azure_aws.jshttps://github.com/manoharreddyporeddy/my-nodejs-notes/blob/master/performance_timers_helper_nodejs_azure_aws.js

这些time()和timeEnd()使用现有的hrtime()函数,它提供了高分辨率的实时性。

希望这可以帮助。


使用Node.js console.time()console.timeEnd()

var i;
console.time("dbsave");

for(i = 1; i < LIMIT; i++){
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, end);
}

end = function(err, saved) {
    console.log(( err || !saved )?"Error":"Saved");
    if(--i === 1){console.timeEnd("dbsave");}
};

另一种选择是使用express-debug工具:

express-debug是express的开发工具。 这是一个简单的中间件,它以非阻碍的方式将有用的调试输出注入到您的html中。

它方便地提供了一个配置面板:

总请求处理时间。 中间件,参数和路由时间。

也。 要添加上面的答案,您可以检查此答案以仅为开发环境启用任何分析代码。


我会建议尝试NodeTime ,这似乎很适合你正在尝试做的事情。


有一种方法是为此设计的。 查看process.hrtime();

所以,我基本上把它放在我的应用程序的顶部。

var start = process.hrtime();

var elapsed_time = function(note){
    var precision = 3; // 3 decimal places
    var elapsed = process.hrtime(start)[1] / 1000000; // divide by a million to get nano to milli
    console.log(process.hrtime(start)[0] + " s, " + elapsed.toFixed(precision) + " ms - " + note); // print message + time
    start = process.hrtime(); // reset the timer
}

然后我用它来查看函数需要多长时间。 这里有一个基本的例子,它打印一个名为“output.txt”的文本文件的内容:

var debug = true;
http.createServer(function(request, response) {

    if(debug) console.log("----------------------------------");
    if(debug) elapsed_time("recieved request");

    var send_html = function(err, contents) {
        if(debug) elapsed_time("start send_html()");
        response.writeHead(200, {'Content-Type': 'text/html' } );
        response.end(contents);
        if(debug) elapsed_time("end send_html()");
    }

    if(debug) elapsed_time("start readFile()");
    fs.readFile('output.txt', send_html);
    if(debug) elapsed_time("end readFile()");

}).listen(8080);

以下是可以在终端(BASH shell)中运行的快速测试:

for i in {1..100}; do echo $i; curl http://localhost:8080/; done

调用console.time('label')将以毫秒为单位记录当前时间,稍后调用console.timeEnd('label')将显示该点的持续时间。

以毫秒为单位的时间将自动打印在标签旁边,因此您不必单独调用console.log即可打印标签:

console.time('test');
//some code
console.timeEnd('test'); //Prints something like that-> test: 11374.004ms

有关更多信息,请参阅console.time上的Mozilla开发人员文档


var start = +new Date();
var counter = 0;
for(var i = 1; i < LIMIT; i++){
    ++counter;
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
          if (--counter === 0) 
          {
              var end = +new Date();
              console.log("all users saved in " + (end-start) + " milliseconds");
          }
    });
}




profiling