blob: 15f9578b7789fac9f103e98ed644538aa47135c3 [file] [log] [blame]
isaacse82f9742013-02-08 03:13:261// In this benchmark, we connect a client to the server, and write
2// as many bytes as we can in the specified time (default = 10s)
Rich Trott4bb529d2016-02-20 01:03:163'use strict';
isaacse82f9742013-02-08 03:13:264
5var common = require('../common.js');
Ben Noordhuisd75f67f2013-07-19 21:59:416var util = require('util');
isaacse82f9742013-02-08 03:13:267
8// if there are dur=N and len=N args, then
9// run the function with those settings.
10// if not, then queue up a bunch of child processes.
11var bench = common.createBenchmark(main, {
12 len: [102400, 1024 * 1024 * 16],
13 type: ['utf', 'asc', 'buf'],
isaacs4b80f212013-02-19 23:03:4114 dur: [5]
isaacse82f9742013-02-08 03:13:2615});
16
17var TCP = process.binding('tcp_wrap').TCP;
Yosuke Furukawa3abfb562015-01-18 16:16:0518var TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap;
19var WriteWrap = process.binding('stream_wrap').WriteWrap;
isaacse82f9742013-02-08 03:13:2620var PORT = common.PORT;
21
22var dur;
23var len;
24var type;
25
26function main(conf) {
27 dur = +conf.dur;
28 len = +conf.len;
29 type = conf.type;
30 server();
31}
32
Ben Noordhuisd75f67f2013-07-19 21:59:4133function fail(err, syscall) {
34 throw util._errnoException(err, syscall);
isaacse82f9742013-02-08 03:13:2635}
36
37function server() {
38 var serverHandle = new TCP();
Ben Noordhuisd75f67f2013-07-19 21:59:4139 var err = serverHandle.bind('127.0.0.1', PORT);
40 if (err)
41 fail(err, 'bind');
isaacse82f9742013-02-08 03:13:2642
Ben Noordhuisd75f67f2013-07-19 21:59:4143 err = serverHandle.listen(511);
44 if (err)
45 fail(err, 'listen');
isaacse82f9742013-02-08 03:13:2646
Ben Noordhuisd75f67f2013-07-19 21:59:4147 serverHandle.onconnection = function(err, clientHandle) {
48 if (err)
49 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:2650
51 var chunk;
52 switch (type) {
53 case 'buf':
54 chunk = new Buffer(len);
55 chunk.fill('x');
56 break;
57 case 'utf':
58 chunk = new Array(len / 2 + 1).join('ΓΌ');
59 break;
60 case 'asc':
61 chunk = new Array(len + 1).join('x');
62 break;
63 default:
64 throw new Error('invalid type: ' + type);
65 break;
66 }
67
68 clientHandle.readStart();
69
70 while (clientHandle.writeQueueSize === 0)
71 write();
72
73 function write() {
Yosuke Furukawa3abfb562015-01-18 16:16:0574 var writeReq = new WriteWrap();
75 writeReq.async = false;
76 writeReq.oncomplete = afterWrite;
Ben Noordhuisd75f67f2013-07-19 21:59:4177 var err;
isaacse82f9742013-02-08 03:13:2678 switch (type) {
79 case 'buf':
Ben Noordhuisd75f67f2013-07-19 21:59:4180 err = clientHandle.writeBuffer(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2681 break;
82 case 'utf':
Ben Noordhuisd75f67f2013-07-19 21:59:4183 err = clientHandle.writeUtf8String(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2684 break;
85 case 'asc':
Ben Noordhuisd75f67f2013-07-19 21:59:4186 err = clientHandle.writeAsciiString(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2687 break;
88 }
89
Fedor Indutny9836a4e2014-01-28 22:48:1090 if (err) {
Ben Noordhuisd75f67f2013-07-19 21:59:4191 fail(err, 'write');
Fedor Indutny9836a4e2014-01-28 22:48:1092 } else if (!writeReq.async) {
93 process.nextTick(function() {
94 afterWrite(null, clientHandle, writeReq);
95 });
96 }
isaacse82f9742013-02-08 03:13:2697 }
98
Yosuke Furukawa3abfb562015-01-18 16:16:0599 function afterWrite(status, handle, req, err) {
Ben Noordhuisd75f67f2013-07-19 21:59:41100 if (err)
101 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26102
103 while (clientHandle.writeQueueSize === 0)
104 write();
105 }
106 };
107
108 client();
109}
110
111function client() {
112 var clientHandle = new TCP();
Yosuke Furukawa3abfb562015-01-18 16:16:05113 var connectReq = new TCPConnectWrap();
Ben Noordhuisd75f67f2013-07-19 21:59:41114 var err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
isaacse82f9742013-02-08 03:13:26115
Ben Noordhuisd75f67f2013-07-19 21:59:41116 if (err)
117 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:26118
119 connectReq.oncomplete = function() {
120 var bytes = 0;
Ben Noordhuisd75f67f2013-07-19 21:59:41121 clientHandle.onread = function(nread, buffer) {
isaacse82f9742013-02-08 03:13:26122 // we're not expecting to ever get an EOF from the client.
123 // just lots of data forever.
Ben Noordhuisd75f67f2013-07-19 21:59:41124 if (nread < 0)
125 fail(nread, 'read');
isaacse82f9742013-02-08 03:13:26126
127 // don't slice the buffer. the point of this is to isolate, not
128 // simulate real traffic.
Trevor Norris22668db2013-07-08 23:53:41129 bytes += buffer.length;
isaacse82f9742013-02-08 03:13:26130 };
131
132 clientHandle.readStart();
133
134 // the meat of the benchmark is right here:
135 bench.start();
136
137 setTimeout(function() {
138 // report in Gb/sec
139 bench.end((bytes * 8) / (1024 * 1024 * 1024));
140 }, dur * 1000);
141 };
142}