如何用回调来测量JavaScript代码的执行时间
我有一段使用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值的差异,但由于代码的异步性质,这可能不正确。
使用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");}
};
有一种方法是为此设计的。 查看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开发人员文档。
上一篇: How to measure execution time of javascript code with callbacks