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}