Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

added throughput benchmark

  • Loading branch information...
commit e57aea63de69645ea65e391a3c19a2a1ce335d78 1 parent 8c3f6d7
@einaros einaros authored
Showing with 107 additions and 1 deletion.
  1. +105 −0 bench/speed.js
  2. +2 −1  package.json
View
105 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);
+ })();
+}
View
3  package.json
@@ -25,6 +25,7 @@
"mocha": "0.8.x",
"should": "0.4.2",
"benchmark": "0.3.x",
- "tinycolor": "0.x"
+ "tinycolor": "0.x",
+ "ansi": "latest"
}
}
Please sign in to comment.
Something went wrong with that request. Please try again.