summaryrefslogtreecommitdiff
path: root/benchmark/net
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2013-02-07 19:10:48 -0800
committerisaacs <i@izs.me>2013-02-19 14:14:30 -0800
commitbaea73ccda8a54d93f0de4f60ffcee568dac8c01 (patch)
treedd237410c823271bc08464961cbb726e3c1e4331 /benchmark/net
parentaa2edd4b89c51836424b211db756ba907230b58b (diff)
downloadnode-baea73ccda8a54d93f0de4f60ffcee568dac8c01.tar.gz
bench: Move net-pipe into benchmark/net
Diffstat (limited to 'benchmark/net')
-rw-r--r--benchmark/net/net-pipe.js114
1 files changed, 114 insertions, 0 deletions
diff --git a/benchmark/net/net-pipe.js b/benchmark/net/net-pipe.js
new file mode 100644
index 000000000..e981cc3b4
--- /dev/null
+++ b/benchmark/net/net-pipe.js
@@ -0,0 +1,114 @@
+// test the speed of .pipe() with sockets
+
+var net = require('net');
+var N = parseInt(process.argv[2]) || 100;
+var start;
+
+function Writer() {
+ this.start = null;
+ this.received = 0;
+ this.writable = true;
+ this.printStats = this.printStats.bind(this);
+ this.interval = setInterval(this.printStats, 1000);
+}
+
+Writer.prototype.write = function(chunk, encoding, cb) {
+ if (!this.start)
+ this.start = process.hrtime();
+
+ this.received += chunk.length;
+
+ if (typeof encoding === 'function')
+ encoding();
+ else if (typeof cb === 'function')
+ cb();
+
+ return true;
+};
+
+// doesn't matter, never emits anything.
+Writer.prototype.on = function() {};
+Writer.prototype.once = function() {};
+Writer.prototype.emit = function() {};
+
+var rates = [];
+var statCounter = 0;
+Writer.prototype.printStats = function() {
+ if (!this.start || !this.received)
+ return;
+ var elapsed = process.hrtime(this.start);
+ elapsed = elapsed[0] * 1E9 + elapsed[1];
+ var bits = this.received * 8;
+ var gbits = bits / (1024 * 1024 * 1024);
+ var rate = gbits / elapsed * 1E9;
+ rates.push(rate);
+ console.log('%s Gbits/sec (%d bits / %d ns)', rate.toFixed(4), bits, elapsed);
+
+ // reset to keep getting instant time.
+ this.start = process.hrtime();
+ this.received = 0;
+
+ if (++statCounter === N) {
+ report();
+ process.exit(0);
+ }
+};
+
+function report() {
+ rates.sort();
+ var min = rates[0];
+ var max = rates[rates.length - 1];
+ var median = rates[rates.length >> 1];
+ var avg = 0;
+ rates.forEach(function(rate) { avg += rate });
+ avg /= rates.length;
+ console.error('min:%s avg:%s max:%s median:%s',
+ min.toFixed(2),
+ avg.toFixed(2),
+ max.toFixed(2),
+ median.toFixed(2));
+}
+
+var len = process.env.LENGTH || 16 * 1024 * 1024;
+var chunk = new Buffer(len);
+for (var i = 0; i < len; i++) {
+ chunk[i] = i % 256;
+}
+
+function Reader() {
+ this.flow = this.flow.bind(this);
+ this.readable = true;
+}
+
+Reader.prototype.pipe = function(dest) {
+ this.dest = dest;
+ this.flow();
+ return dest;
+};
+
+Reader.prototype.flow = function() {
+ var dest = this.dest;
+ var res = dest.write(chunk);
+ if (!res)
+ dest.once('drain', this.flow);
+ else
+ process.nextTick(this.flow);
+};
+
+
+var reader = new Reader();
+var writer = new Writer();
+
+// the actual benchmark.
+var server = net.createServer(function(socket) {
+ socket.pipe(socket);
+});
+
+server.listen(1337, function() {
+ var socket = net.connect(1337);
+ socket.on('connect', function() {
+ reader.pipe(socket);
+ socket.pipe(writer);
+ });
+});
+