summaryrefslogtreecommitdiff
path: root/benchmark/net
diff options
context:
space:
mode:
authorMatteo Collina <hello@matteocollina.com>2015-12-16 09:39:11 +0100
committerMatteo Collina <hello@matteocollina.com>2016-02-09 09:30:12 +0000
commit7764b6cb964ef8c481f3c348b76c6980e1e4f977 (patch)
tree344a796307b557705261aed7c2626abd9434f443 /benchmark/net
parentdccccbbbe7ee16544a00b6aee71ddba8c1ca9a84 (diff)
downloadandroid-node-v8-7764b6cb964ef8c481f3c348b76c6980e1e4f977.tar.gz
android-node-v8-7764b6cb964ef8c481f3c348b76c6980e1e4f977.tar.bz2
android-node-v8-7764b6cb964ef8c481f3c348b76c6980e1e4f977.zip
streams: 5% throughput gain when sending small chunks
Improves the performance when moving small buffers by 5%, and it adds a benchmark to avoid regression in that area. In all other cases it is equally performant to current master. Full performance results available at: https://gist.github.com/mcollina/717c35ad07d15710b6b9. PR-URL: https://github.com/nodejs/node/pull/4354 Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'benchmark/net')
-rw-r--r--benchmark/net/net-c2s-cork.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/benchmark/net/net-c2s-cork.js b/benchmark/net/net-c2s-cork.js
new file mode 100644
index 0000000000..5f8e0fa435
--- /dev/null
+++ b/benchmark/net/net-c2s-cork.js
@@ -0,0 +1,96 @@
+// test the speed of .pipe() with sockets
+
+var common = require('../common.js');
+var PORT = common.PORT;
+
+var bench = common.createBenchmark(main, {
+ len: [4, 8, 16, 32, 64, 128, 512, 1024],
+ type: ['buf'],
+ dur: [5],
+});
+
+var dur;
+var len;
+var type;
+var chunk;
+var encoding;
+
+function main(conf) {
+ dur = +conf.dur;
+ len = +conf.len;
+ type = conf.type;
+
+ switch (type) {
+ case 'buf':
+ chunk = new Buffer(len);
+ chunk.fill('x');
+ break;
+ case 'utf':
+ encoding = 'utf8';
+ chunk = new Array(len / 2 + 1).join('ΓΌ');
+ break;
+ case 'asc':
+ encoding = 'ascii';
+ chunk = new Array(len + 1).join('x');
+ break;
+ default:
+ throw new Error('invalid type: ' + type);
+ break;
+ }
+
+ server();
+}
+
+var net = require('net');
+
+function Writer() {
+ this.received = 0;
+ this.writable = true;
+}
+
+Writer.prototype.write = function(chunk, encoding, cb) {
+ 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() {};
+
+function server() {
+ var writer = new Writer();
+
+ // the actual benchmark.
+ var server = net.createServer(function(socket) {
+ socket.pipe(writer);
+ });
+
+ server.listen(PORT, function() {
+ var socket = net.connect(PORT);
+ socket.on('connect', function() {
+ bench.start();
+
+ socket.on('drain', send)
+ send()
+
+ setTimeout(function() {
+ var bytes = writer.received;
+ var gbits = (bytes * 8) / (1024 * 1024 * 1024);
+ bench.end(gbits);
+ }, dur * 1000);
+
+ function send() {
+ socket.cork();
+ while(socket.write(chunk, encoding)) {}
+ socket.uncork();
+ }
+ });
+ });
+}