var http = require('http');
http.createServer(function(req,res){
res.writeHeader(200, {'Content-Type' : 'text/html ; charset=utf-8'})
if(req.url !== '/favicon.ico'){
console.time('test');
var c=1,a=2,b=3;
res.write(show()+''+c);
c=a+b;
res.write('<br />')
res.write(c+'<br />');
console.timeEnd('test');
res.end()
}
}).listen(8000)
function show(){
var str='';
for(var i=0;i<10000;i++){
str+=i*i*i*i+'<br />';
}
return str
}
console.log('server is running at http://127.0.0.1:8000')
最後兩行是1和5!
書上寫http.ServerResponse物件實作了一個 stream.Writable(可寫流)。但是可寫流一般是異步的(如fs寫入流,zlib流,子程序的stdin)啊,這樣對事件驅動的服務模型正好。現在我測試出的是res.write同步也就是說要執行完這個回掉才能執行事件隊列裡的下一個回掉?
function(req,res)是ruquest事件的回掉,也就是說如果應對好幾萬個並發請求就要執行幾萬個function(req,res),哪怕function(req,res)裡沒有cpu密集應用積少成多這不是使用者存取就會有延遲?但是node非常擅長處理密集io啊?是我想錯了什麼?
這個show函數是我故意弄得,因為js是單線程不擅長處理cpu密集業務,所以res.write(show() '' c)時間比較長這樣比較好看res.write是不是異步,如果是res.write是異步那麼就會先執行c=a b;那c定是5;
node 的優勢是指,能處理高並發,是可以應付大量的請求,但是處理respone.write 或者查詢數據庫的操作是另外的線程處理的,就好像一個餐廳一樣,有分廚師還有一個服務員(單線程),不像一般web服務框架只有一個廚師而且要兼職服務員,
所以你上面的情況是不是密集的io,而像是,餐廳的廚師忙不過來處理你的菜,導致服務員上菜慢。
很明顯,執行
show()
時,還沒開始執行write()
,所以你這個測試方法本身就不對。write
只是將資料寫到內部的緩衝區就返回了,不是說把資料發送完成才回,所以說幾乎沒有佔用CPU時間