Skip to content

Commit

Permalink
added throughput benchmark
Browse files Browse the repository at this point in the history
  • Loading branch information
einaros committed Feb 29, 2012
1 parent 8c3f6d7 commit e57aea6
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 1 deletion.
105 changes: 105 additions & 0 deletions bench/speed.js
@@ -0,0 +1,105 @@
var cluster = require('cluster')
, WebSocket = require('../')
, WebSocketServer = WebSocket.Server
, crypto = require('crypto')
, util = require('util')
, ansi = require('ansi');
require('tinycolor');

function roundPrec(num, prec) {
var mul = Math.pow(10, prec);
return Math.round(num * mul) / mul;
}

function humanSize(bytes) {
if (bytes >= 1048576) return roundPrec(bytes / 1048576, 2) + ' MB';
if (bytes >= 1024) return roundPrec(bytes / 1024, 2) + ' kB';
return roundPrec(bytes, 2) + ' B';
}

function generateRandomData(size) {
var buffer = new Buffer(size);
for (var i = 0; i < size; ++i) {
buffer[i] = ~~(Math.random() * 127);
}
return buffer;
}

if (cluster.isMaster) {
var wss = new WebSocketServer({port: 8181}, function() {
cluster.fork();
});
wss.on('connection', function(ws) {
ws.on('message', function(data, flags) {
ws.send(data, {binary: flags&&flags.binary});
});
ws.on('close', function() {});
});
cluster.on('death', function(worker) {
wss.close();
});
}
else {
var cursor = ansi(process.stdout);

var configs = [
[true, 10000, 64],
[true, 5000, 16*1024],
[true, 1000, 128*1024],
[true, 100, 1024*1024],
[true, 1, 500*1024*1024],
[false, 10000, 64],
[false, 5000, 16*1024],
[false, 1000, 128*1024],
[false, 100, 1024*1024],
];

var largest = configs[0][1];
for (var i = 0, l = configs.length; i < l; ++i) {
if (configs[i][2] > largest) largest = configs[i][2];
}

console.log('Generating %s of test data ...', humanSize(largest));
var randomBytes = generateRandomData(largest);

function roundtrip(useBinary, roundtrips, size, cb) {
var data = randomBytes.slice(0, size);
var prefix = util.format('Running %d roundtrips of %s %s data', roundtrips, humanSize(size), useBinary ? 'binary' : 'text');
console.log(prefix);
var client = new WebSocket('ws://localhost:' + '8181');
var dt;
var roundtrip = 0;
function send() {
client.send(data, {binary: useBinary});
}
client.on('error', function(e) {
console.error(e);
process.exit();
});
client.on('open', function() {
dt = Date.now();
send();
});
client.on('message', function(data, flags) {
if (++roundtrip == roundtrips) {
var elapsed = Date.now() - dt;
cursor.up();
console.log('%s:\t%ss\t%s'
, useBinary ? prefix.green : prefix.cyan
, roundPrec(elapsed / 1000, 1).toString().green.bold
, (humanSize((size * roundtrips) / elapsed * 1000) + '/s').blue.bold);
client.close();
cb();
return;
}
process.nextTick(send);
});
}

(function run() {
if (configs.length == 0) process.exit();
var config = configs.shift();
config.push(run);
roundtrip.apply(null, config);
})();
}
3 changes: 2 additions & 1 deletion package.json
Expand Up @@ -25,6 +25,7 @@
"mocha": "0.8.x",
"should": "0.4.2",
"benchmark": "0.3.x",
"tinycolor": "0.x"
"tinycolor": "0.x",
"ansi": "latest"
}
}

0 comments on commit e57aea6

Please sign in to comment.