diff options
author | Matteo Collina <hello@matteocollina.com> | 2015-12-16 09:39:11 +0100 |
---|---|---|
committer | Matteo Collina <hello@matteocollina.com> | 2016-02-09 09:30:12 +0000 |
commit | 7764b6cb964ef8c481f3c348b76c6980e1e4f977 (patch) | |
tree | 344a796307b557705261aed7c2626abd9434f443 /benchmark/net | |
parent | dccccbbbe7ee16544a00b6aee71ddba8c1ca9a84 (diff) | |
download | android-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.js | 96 |
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(); + } + }); + }); +} |