在node.js中的时间Web请求

鉴于节点的asynchronous性质,很难对一系列Web请求进行计时。 我将如何触发100个networking请求,并找出每个请求需要多长时间? 了解操作系统将只允许一些并发的Web请求,我如何得到每个单独的Web请求的时间,消除等待其他连接完成的时间。 我希望套接字事件是在请求启动时触发的,但是看起来套接字事件在连接build立后触发。

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('-'); }); } 

如果您担心操作系统并发性,只需在请求中引入最大的并发(调节),而不要试图猜测何时启动操作系统。 我跳过一些小的细节,如error handling和使用优秀的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)); }); 

为了方便使用,做你似乎想做的事,我还没有看到任何东西击败NodeTime 。