// In this benchmark, we connect a client to the server, and write // as many bytes as we can in the specified time (default = 10s) var common = require('../common.js'); // 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 PORT = common.PORT; var dur; var len; var type; function main(conf) { dur = +conf.dur; len = +conf.len; type = conf.type; server(); } function fail(syscall) { var e = new Error(syscall + ' ' + errno); e.errno = e.code = errno; e.syscall = syscall; throw e; } function server() { var serverHandle = new TCP(); var r = serverHandle.bind('127.0.0.1', PORT); if (r) fail('bind'); var r = serverHandle.listen(511); if (r) fail('listen'); serverHandle.onconnection = function(clientHandle) { if (!clientHandle) fail('connect'); clientHandle.onread = function(buffer, offset, length) { // we're not expecting to ever get an EOF from the client. // just lots of data forever. if (!buffer) fail('read'); var chunk = buffer.slice(offset, offset + length); var writeReq = clientHandle.writeBuffer(chunk); if (!writeReq) fail('write'); writeReq.oncomplete = function(status, handle, req) { if (status) fail('write'); }; }; clientHandle.readStart(); }; client(); } function client() { var chunk; switch (type) { case 'buf': chunk = new Buffer(len); chunk.fill('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); break; } var clientHandle = new TCP(); var connectReq = clientHandle.connect('127.0.0.1', PORT); var bytes = 0; if (!connectReq) fail('connect'); clientHandle.readStart(); clientHandle.onread = function(buffer, start, length) { if (!buffer) fail('read'); bytes += length; }; connectReq.oncomplete = function() { bench.start(); setTimeout(function() { // multiply by 2 since we're sending it first one way // then then back again. bench.end(2 * (bytes * 8) / (1024 * 1024 * 1024)); }, dur * 1000); while (clientHandle.writeQueueSize === 0) write(); }; function write() { var writeReq switch (type) { case 'buf': writeReq = clientHandle.writeBuffer(chunk); break; case 'utf': writeReq = clientHandle.writeUtf8String(chunk); break; case 'asc': writeReq = clientHandle.writeAsciiString(chunk); break; } if (!writeReq) fail('write'); writeReq.oncomplete = afterWrite; } function afterWrite(status, handle, req) { if (status) fail('write'); while (clientHandle.writeQueueSize === 0) write(); } }