arnaucube
arnaucube/comunicationLeapPublic Self-hosted repository
comunicationLeap/node_modules/ws/bench/speed.js
node_modules/ws/bench/speed.jsRaw
  1var cluster = require('cluster')
  2  , WebSocket = require('../')
  3  , WebSocketServer = WebSocket.Server
  4  , crypto = require('crypto')
  5  , util = require('util')
  6  , ansi = require('ansi');
  7require('tinycolor');
  8
  9function roundPrec(num, prec) {
 10  var mul = Math.pow(10, prec);
 11  return Math.round(num * mul) / mul;
 12}
 13
 14function humanSize(bytes) {
 15  if (bytes >= 1048576) return roundPrec(bytes / 1048576, 2) + ' MB';
 16  if (bytes >= 1024) return roundPrec(bytes / 1024, 2) + ' kB';
 17  return roundPrec(bytes, 2) + ' B';
 18}
 19
 20function generateRandomData(size) {
 21  var buffer = new Buffer(size);
 22  for (var i = 0; i < size; ++i) {
 23    buffer[i] = ~~(Math.random() * 127);
 24  }
 25  return buffer;
 26}
 27
 28if (cluster.isMaster) {
 29  var wss = new WebSocketServer({port: 8181}, function() {
 30    cluster.fork();
 31  });
 32  wss.on('connection', function(ws) {
 33    ws.on('message', function(data, flags) {
 34      ws.send(data, {binary: flags&&flags.binary});
 35    });
 36    ws.on('close', function() {});
 37  });
 38  cluster.on('death', function(worker) {
 39    wss.close();
 40  });
 41}
 42else {
 43  var cursor = ansi(process.stdout);
 44
 45  var configs = [
 46    [true, 10000, 64],
 47    [true, 5000, 16*1024],
 48    [true, 1000, 128*1024],
 49    [true, 100, 1024*1024],
 50    [true, 1, 500*1024*1024],
 51    [false, 10000, 64],
 52    [false, 5000, 16*1024],
 53    [false, 1000, 128*1024],
 54    [false, 100, 1024*1024],
 55  ];
 56
 57  var largest = configs[0][1];
 58  for (var i = 0, l = configs.length; i < l; ++i) {
 59    if (configs[i][2] > largest) largest = configs[i][2];
 60  }
 61
 62  console.log('Generating %s of test data ...', humanSize(largest));
 63  var randomBytes = generateRandomData(largest);
 64
 65  function roundtrip(useBinary, roundtrips, size, cb) {
 66    var data = randomBytes.slice(0, size);
 67    var prefix = util.format('Running %d roundtrips of %s %s data', roundtrips, humanSize(size), useBinary ? 'binary' : 'text');
 68    console.log(prefix);
 69    var client = new WebSocket('ws://localhost:' + '8181');
 70    var dt;
 71    var roundtrip = 0;
 72    function send() {
 73      client.send(data, {binary: useBinary});
 74    }
 75    client.on('error', function(e) {
 76      console.error(e);
 77      process.exit();
 78    });
 79    client.on('open', function() {
 80      dt = Date.now();
 81      send();
 82    });
 83    client.on('message', function(data, flags) {
 84      if (++roundtrip == roundtrips) {
 85        var elapsed = Date.now() - dt;
 86        cursor.up();
 87        console.log('%s:\t%ss\t%s'
 88          , useBinary ? prefix.green : prefix.cyan
 89          , roundPrec(elapsed / 1000, 1).toString().green.bold
 90          , (humanSize((size * roundtrips) / elapsed * 1000) + '/s').blue.bold);
 91        client.close();
 92        cb();
 93        return;
 94      }
 95      process.nextTick(send);
 96    });
 97  }
 98
 99  (function run() {
100    if (configs.length == 0) process.exit();
101    var config = configs.shift();
102    config.push(run);
103    roundtrip.apply(null, config);
104  })();
105}