1

ノードの非同期性を考えると、一連のWebリクエストのタイミングを計ることは困難です。100個のWebリクエストを実行し、個々のリクエストにかかる時間を把握するにはどうすればよいですか?OSを知っていると、いくつかの同時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

OSの同時実行性が心配な場合は、OSがいつ起動したかを正確に推測するのではなく、リクエストに最大の同時実行性(スロットリング)を導入するだけです。エラー処理や優れた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 に答える