用节点js测量时间

时间:2015-06-14 15:45:25

标签: node.js performance measure

我想通过节点端发送2000个db请求来衡量每个请求的时间。 像这样的东西:

var getKey = function(key, i) {

   console.time(i);

   client.getKey(key, function(val) { 
   console.timeEnd(i);

}


}

for(var i = 0; i < 2000; i ++) {

   getKey(keys[i], i);

}

问题是它没有很好地测量node.it到达开始时间然后等待(因为它的一个线程) - 所以每个度量得到的数量超过实际应该的数量。 我该如何解决?我对NodeJS有点新鲜。感谢。

2 个答案:

答案 0 :(得分:4)

process.hrtime()提供了精细的性能功能。 Tom Pawlak有一篇很棒的博客文章,标题为“How to Measure Execution Time in Node.js”,它解释了与测量node.js代码的执行时间相关的最佳实践:

process.hrtime() function returns high-resolution real time in [seconds, 
nanoseconds] Array. 

如果您有任何疑问,请与我们联系!

答案 1 :(得分:1)

如果您想测量一个请求所花费的时间并且不希望任何其他操作干扰该时间(由于node.js单线程),那么您不必在启动任何其他请求时您正在测量一个请求的时间。发起一个请求并测量获得结果的时间。

如果您想测量发送和接收N个请求/响应的时间,那么请将整个块开始计时,而不是每个单独的请求。

所以,这真的取决于你想要衡量的东西。

请记住,因为node.js I / O通常是异步的,所以测量单个网络请求的时间并不是测量执行请求的CPU时间 - 它正在测量通过网络发送请求的时间,接收服务器接收并处理请求,然后将结果发回,并让node.js服务器接收结果,然后使用该结果调用您的代码。主机CPU大部分时间都处于空闲状态,因为大部分时间都是等待响应通过网络回来的。

根据您的评论,如果您一次发送2000个请求,您可能会看到后续请求变慢,因为您发送请求的服务器不能立即处理2000个请求。它将具有有限数量的CPU,因此一旦它忙于处理N个请求,它可能会将剩余的请求排队,直到一个完成它可以获取下一个请求。这种排队可能发生在TCP层,或者服务器可能实现它自己的传入任务队列(取决于服务器设计)。