2012-08-25 33 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