2015-06-14 55 views
2

我想通过节点端发送2000 db请求来测量每个请求的时间。 是这样的:使用节点js测量时间

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); 

} 

的问题是它不能很好地测量beacouse node.it的获取到开始时间,然后等待(因为它的一个线程) - 所以每个指标比它变得更加毫秒真应该。 我该如何解决它?我对NodeJS有点新鲜。谢谢。

+0

您能否详细说明“*问题是由于节点不能很好地衡量?*”您期望的结果是什么?这与您实际得到的结果有何不同? –

+0

如果我的理解正确,您想测量每次独立调用getKey的时间。而且,由于您正在大量解雇他们,所有他们各自的回调都会被批量解雇,并阻止每次独立通话的正确措施。一个解决方案可能是测量所有2000个呼叫的时间合并,并将时间除以2000年。这是否行得通? – laggingreflex

+0

是的,这是问题。事情是我想检查每个请求的时间,看看它是否变慢。 – Michelle

回答

4

粒度性能功能可用于process.hrtime()。汤姆·帕夫拉克有很大的博客文章题为“How to Measure Execution Time in Node.js”,这解释了测量你的Node.js代码执行时间相关的最佳实践:

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

请让我知道如果您有任何问题!

0

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

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

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


根据您的意见,如果您发送一次请求2000,你很可能会看到以后的请求放慢,因为服务器要发送的请求不能同时处理2000个请求。它的CPU数量有限,所以一旦它忙于处理N个请求,它可能会排队剩余的请求,直到完成后才能接下一个请求。这个排队可能发生在TCP层,或者服务器可能实现它自己的传入任务队列(取决于服务器设计)。