2012-08-25 49 views
1

鑑於節點的異步特性,很難對一系列Web請求計時。我會如何解決100個網絡請求,並找出每個請求需要多長時間?瞭解操作系統將只允許少量併發的Web請求,我如何獲得每個WebRequest的時間,消除等待其他連接完成的時間。我希望套接字事件在請求啓動時被觸發,但似乎套接字事件在連接建立後被觸發。node.js中的時間web請求

var http = require('http'); 

var urls = [ 
    '/cameron', 
    '/sara', 
    '...', 


// Time a url collection. 
function timeUrl(url, calback) { 
    var options = { 
     host: 'www.examplesite.com', 
     port: 80, 
     path: '' 
    };  
    var times = []; 
    times.push({'text': 'start', 'time':Date.now()}); 

    http.get(options, function(res) { 
     times.push({'text': 'response', 'time':Date.now()});  

     var result = '';   
     res.on('data', function(chunk) { 
      result += chunk.length ; 
      // result += chunk;   
     }); 
     res.on('end', function() { 
      times.push({'text': 'end', 'time': Date.now(), 'body': result, 'statusCode': res.statusCode}); // , 
      calback(times); 
     }); 
    }).on('error', function(e) { 
     calback(); 
     console.log("Got error: " + e.message); 
     times.push({'error':Date.now()}); 
    }).on('socket', function (response) { 
     times.push({'text': 'socket', 'time':Date.now()}); 
    }); 
} 
for (var i = 0; i < urls.length; i++) { 
    var url = urls[i]; 
    timeUrl(url, function(times) { 
     console.log(url); 
     for (var i = 0; i < times.length; i++) { 
      console.log(times[i].text, times[i].time - times[1].time , 'ms'); 
     } 
     console.log('statusCode:', times[times.length -1].statusCode, 'Response Size:', times[times.length -1].body); 
     console.log('-'); 
    }); 
} 

回答

2

如果您擔心操作系統併發性,只需將最大的併發(節流)引入到您的請求中,而不是試圖猜測何時啓動操作系統。我正在跳過一些小的細節,如錯誤處理和使用優秀的async.js庫:

var http = require('http') 
    , async = require('async') 
    , CONCURRENCY = 5 // edit to fit your OS concurrency limit 
    , results = {} 
    , urls = [ 
    '/cameron', 
    '/sara', 
    '/...' 
]; 

// Time a url collection. 
function timeUrl(url, callback) { 
    var options = { host: 'www.examplesite.com', port: 80 } 
     , start = Date.now() 
     , socket = null; 
    options.path = url; 

    http.get(options, function(res) { 
     var response = Date.now() 
     , size = 0; 
     res.on('data', function(chunk) { size += chunk.length; }); 
     res.on('end', function() { 
      var end = Date.now(); 
      results[url] = { start: start, socket: socket, response: response, end: end, size: size }; 
      callback(); 
     }); 
    }).on('error', function(e) { 
     results[url] = { start: start, socket: socket, error: Date.now(), stack: e }; 
     callback(); 
    }).on('socket', function() { 
     socket = Date.now(); 
    }); 
} 

async.forEachLimit(urls, CONCURRENCY, timeUrl, function() { 
    console.log(JSON.stringify(results)); 
}); 
+0

這有效,是否有動態知道CONCURRENCY字段應該是什麼? – JustEngland

+0

不是我所知道的。然而現在大多數瀏覽器都帶有[16個併發連接](http://www.browserscope.org/?category=network)(參見Max Connections列),如果他們仍然是這樣的話在操作系統級別上受到限制。因此將其設置爲16將是一個合理的保守限制 - 它會使您的測試運行速度更慢(併發性更低),但更可靠。 – zzen

2

爲了方便使用,做你想做的事情,我沒有看到任何東西擊敗Nodetime