diff options
author | Florian Dold <florian.dold@gmail.com> | 2019-04-03 15:43:32 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2019-04-03 15:45:57 +0200 |
commit | 71e285b94c7edaa43aa8115965cf5a36b8e0f80a (patch) | |
tree | 7d4aa9d0d5aff686b106cd5da72ba77960c4af43 /deps/node/benchmark/net/net-s2c.js | |
parent | 7dadf9356b4f3f4137ce982ea5bb960283116e9a (diff) | |
download | akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.gz akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.tar.bz2 akono-71e285b94c7edaa43aa8115965cf5a36b8e0f80a.zip |
Node.js v11.13.0
Diffstat (limited to 'deps/node/benchmark/net/net-s2c.js')
-rw-r--r-- | deps/node/benchmark/net/net-s2c.js | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/deps/node/benchmark/net/net-s2c.js b/deps/node/benchmark/net/net-s2c.js new file mode 100644 index 00000000..848168cd --- /dev/null +++ b/deps/node/benchmark/net/net-s2c.js @@ -0,0 +1,101 @@ +// Test the speed of .pipe() with sockets +'use strict'; + +const common = require('../common.js'); +const PORT = common.PORT; + +const bench = common.createBenchmark(main, { + len: [64, 102400, 1024 * 1024 * 16], + type: ['utf', 'asc', 'buf'], + dur: [5] +}); + +var chunk; +var encoding; + +function main({ dur, len, type }) { + switch (type) { + case 'buf': + chunk = Buffer.alloc(len, 'x'); + break; + case 'utf': + encoding = 'utf8'; + chunk = 'ΓΌ'.repeat(len / 2); + break; + case 'asc': + encoding = 'ascii'; + chunk = 'x'.repeat(len); + break; + default: + throw new Error(`invalid type: ${type}`); + } + + const reader = new Reader(); + const writer = new Writer(); + + // the actual benchmark. + const server = net.createServer((socket) => { + reader.pipe(socket); + }); + + server.listen(PORT, () => { + const socket = net.connect(PORT); + socket.on('connect', () => { + bench.start(); + + socket.pipe(writer); + + setTimeout(() => { + const bytes = writer.received; + const gbits = (bytes * 8) / (1024 * 1024 * 1024); + bench.end(gbits); + process.exit(0); + }, dur * 1000); + }); + }); +} + +const 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() {}; +Writer.prototype.prependListener = function() {}; + + +function flow() { + const dest = this.dest; + const res = dest.write(chunk, encoding); + if (!res) + dest.once('drain', this.flow); + else + process.nextTick(this.flow); +} + +function Reader() { + this.flow = flow.bind(this); + this.readable = true; +} + +Reader.prototype.pipe = function(dest) { + this.dest = dest; + this.flow(); + return dest; +}; |