2013-09-26 101 views
1

考慮以下代碼:節點JS的請求過程性能

var http = require("http"); 
http.createServer(function(request, response) { 
    for (var i = 0; i < 1000000; i++) { 
     console.log("Request received"); 
    } 
    response.writeHead(200, { 
     "Content-Type": "text/plain" 
    }); 
    response.write("Hello World"); 
    response.end(); 
}).listen(8888, "127.0.0.1"); 

如果我們運行這段代碼,我們應該等待多分鐘也獲得response.But如果在對運行不console.log("Request received");對於我們得到的響應與高速? 爲什麼?

+3

你認爲寫一些東西到控制檯/日誌是一樣快,沒有做任何操作?爲什麼? – WiredPrairie

回答

0

我認爲是因爲在控制檯寫入console.log("Request received");得到時間的過程。

1

console.log與其他任何打印/回顯/系統輸出在您的STDOUT控制檯上執行某些操作相當緩慢。

編輯:除此之外,解釋器將簡單地跳過循環,如果沒有在其中的操作。如果你真的做了一些事情,那當然需要時間。

+0

你確定循環會跳過嗎?在循環的條件和步驟中可能會發生重要的事情。編輯:實際上,循環確實得到運行。你可以通過計時循環來看到這個空身體,但不同的界限 - 對'i'的更高限制將運行更長時間。 –

+0

@AaronDufour非常有趣,謝謝你的信息。我認爲V8會自動分析這個。 –

+0

當您第二次運行它時可能會跳過 - V8使用統計分析器來確定什麼是熱代碼以及嘗試優化的位置 –

2

簡單地說,一個空的「for」循環幾乎爲空。 但是console.log()的輸出需要更多的時間,並且它也是同步的。

2

首先開始V0.6console.log()是同步的(即它會阻止主事件循環。)

你寫了周圍17MBs標準輸出對每個請求。服務器可能需要幾分鐘才能響應。