2015-06-14 79 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層,或者服務器可能實現它自己的傳入任務隊列(取決於服務器設計)。