// In this benchmark, we connect a client to the server, and write // as many bytes as we can in the specified time (default = 10s) 'use strict'; var common = require('../common.js'); var util = require('util'); // if there are --dur=N and --len=N args, then // run the function with those settings. // if not, then queue up a bunch of child processes. var bench = common.createBenchmark(main, { len: [102400, 1024 * 1024 * 16], type: ['utf', 'asc', 'buf'], dur: [5] }); var TCP = process.binding('tcp_wrap').TCP; var TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap; var WriteWrap = process.binding('stream_wrap').WriteWrap; var PORT = common.PORT; var dur; var len; var type; function main(conf) { dur = +conf.dur; len = +conf.len; type = conf.type; server(); } function fail(err, syscall) { throw util._errnoException(err, syscall); } function server() { var serverHandle = new TCP(); var err = serverHandle.bind('127.0.0.1', PORT); if (err) fail(err, 'bind'); err = serverHandle.listen(511); if (err) fail(err, 'listen'); serverHandle.onconnection = function(err, clientHandle) { if (err) fail(err, 'connect'); // the meat of the benchmark is right here: bench.start(); var bytes = 0; setTimeout(function() { // report in Gb/sec bench.end((bytes * 8) / (1024 * 1024 * 1024)); }, dur * 1000); clientHandle.onread = function(nread, buffer) { // we're not expecting to ever get an EOF from the client. // just lots of data forever. if (nread < 0) fail(nread, 'read'); // don't slice the buffer. the point of this is to isolate, not // simulate real traffic. bytes += buffer.length; }; clientHandle.readStart(); }; client(); } function client() { var chunk; switch (type) { case 'buf': chunk = Buffer.alloc(len, 'x'); break; case 'utf': chunk = new Array(len / 2 + 1).join('ΓΌ'); break; case 'asc': chunk = new Array(len + 1).join('x'); break; default: throw new Error('invalid type: ' + type); } var clientHandle = new TCP(); var connectReq = new TCPConnectWrap(); var err = clientHandle.connect(connectReq, '127.0.0.1', PORT); if (err) fail(err, 'connect'); clientHandle.readStart(); connectReq.oncomplete = function(err) { if (err) fail(err, 'connect'); while (clientHandle.writeQueueSize === 0) write(); }; function write() { var writeReq = new WriteWrap(); writeReq.oncomplete = afterWrite; var err; switch (type) { case 'buf': err = clientHandle.writeBuffer(writeReq, chunk); break; case 'utf': err = clientHandle.writeUtf8String(writeReq, chunk); break; case 'asc': err = clientHandle.writeAsciiString(writeReq, chunk); break; } if (err) fail(err, 'write'); } function afterWrite(err, handle, req) { if (err) fail(err, 'write'); while (clientHandle.writeQueueSize === 0) write(); } }