1

鉴于 Node 的异步特性,很难对一系列 Web 请求进行计时。我将如何触发 100 个网络请求并计算每个单独的请求需要多长时间?知道操作系统只允许几个并发的 Web 请求,我如何获得每个单独的 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('-');
    });
}
4

2 回答 2

2

为了便于使用,做你想做的事,我还没有看到任何比Nodetime 更好的东西。

于 2012-08-25T16:13:09.830 回答
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));
});
于 2012-08-25T22:08:52.863 回答