blob: 502586c2a05e292f90609c582a3f791a45557ef3 [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)
3
4var common = require('../common.js');
Ben Noordhuisd75f67f2013-07-19 21:59:415var util = require('util');
isaacse82f9742013-02-08 03:13:266
7// if there are dur=N and len=N args, then
8// run the function with those settings.
9// if not, then queue up a bunch of child processes.
10var bench = common.createBenchmark(main, {
11 len: [102400, 1024 * 1024 * 16],
12 type: ['utf', 'asc', 'buf'],
isaacs4b80f212013-02-19 23:03:4113 dur: [5]
isaacse82f9742013-02-08 03:13:2614});
15
16var TCP = process.binding('tcp_wrap').TCP;
Yosuke Furukawa3abfb562015-01-18 16:16:0517var TCPConnectWrap = process.binding('tcp_wrap').TCPConnectWrap;
18var WriteWrap = process.binding('stream_wrap').WriteWrap;
isaacse82f9742013-02-08 03:13:2619var PORT = common.PORT;
20
21var dur;
22var len;
23var type;
24
25function main(conf) {
26 dur = +conf.dur;
27 len = +conf.len;
28 type = conf.type;
29 server();
30}
31
Ben Noordhuisd75f67f2013-07-19 21:59:4132function fail(err, syscall) {
33 throw util._errnoException(err, syscall);
isaacse82f9742013-02-08 03:13:2634}
35
36function server() {
37 var serverHandle = new TCP();
Ben Noordhuisd75f67f2013-07-19 21:59:4138 var err = serverHandle.bind('127.0.0.1', PORT);
39 if (err)
40 fail(err, 'bind');
isaacse82f9742013-02-08 03:13:2641
Ben Noordhuisd75f67f2013-07-19 21:59:4142 err = serverHandle.listen(511);
43 if (err)
44 fail(err, 'listen');
isaacse82f9742013-02-08 03:13:2645
Ben Noordhuisd75f67f2013-07-19 21:59:4146 serverHandle.onconnection = function(err, clientHandle) {
47 if (err)
48 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:2649
50 var chunk;
51 switch (type) {
52 case 'buf':
53 chunk = new Buffer(len);
54 chunk.fill('x');
55 break;
56 case 'utf':
57 chunk = new Array(len / 2 + 1).join('ΓΌ');
58 break;
59 case 'asc':
60 chunk = new Array(len + 1).join('x');
61 break;
62 default:
63 throw new Error('invalid type: ' + type);
64 break;
65 }
66
67 clientHandle.readStart();
68
69 while (clientHandle.writeQueueSize === 0)
70 write();
71
72 function write() {
Yosuke Furukawa3abfb562015-01-18 16:16:0573 var writeReq = new WriteWrap();
74 writeReq.async = false;
75 writeReq.oncomplete = afterWrite;
Ben Noordhuisd75f67f2013-07-19 21:59:4176 var err;
isaacse82f9742013-02-08 03:13:2677 switch (type) {
78 case 'buf':
Ben Noordhuisd75f67f2013-07-19 21:59:4179 err = clientHandle.writeBuffer(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2680 break;
81 case 'utf':
Ben Noordhuisd75f67f2013-07-19 21:59:4182 err = clientHandle.writeUtf8String(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2683 break;
84 case 'asc':
Ben Noordhuisd75f67f2013-07-19 21:59:4185 err = clientHandle.writeAsciiString(writeReq, chunk);
isaacse82f9742013-02-08 03:13:2686 break;
87 }
88
Fedor Indutny9836a4e2014-01-28 22:48:1089 if (err) {
Ben Noordhuisd75f67f2013-07-19 21:59:4190 fail(err, 'write');
Fedor Indutny9836a4e2014-01-28 22:48:1091 } else if (!writeReq.async) {
92 process.nextTick(function() {
93 afterWrite(null, clientHandle, writeReq);
94 });
95 }
isaacse82f9742013-02-08 03:13:2696 }
97
Yosuke Furukawa3abfb562015-01-18 16:16:0598 function afterWrite(status, handle, req, err) {
Ben Noordhuisd75f67f2013-07-19 21:59:4199 if (err)
100 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26101
102 while (clientHandle.writeQueueSize === 0)
103 write();
104 }
105 };
106
107 client();
108}
109
110function client() {
111 var clientHandle = new TCP();
Yosuke Furukawa3abfb562015-01-18 16:16:05112 var connectReq = new TCPConnectWrap();
Ben Noordhuisd75f67f2013-07-19 21:59:41113 var err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
isaacse82f9742013-02-08 03:13:26114
Ben Noordhuisd75f67f2013-07-19 21:59:41115 if (err)
116 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:26117
118 connectReq.oncomplete = function() {
119 var bytes = 0;
Ben Noordhuisd75f67f2013-07-19 21:59:41120 clientHandle.onread = function(nread, buffer) {
isaacse82f9742013-02-08 03:13:26121 // we're not expecting to ever get an EOF from the client.
122 // just lots of data forever.
Ben Noordhuisd75f67f2013-07-19 21:59:41123 if (nread < 0)
124 fail(nread, 'read');
isaacse82f9742013-02-08 03:13:26125
126 // don't slice the buffer. the point of this is to isolate, not
127 // simulate real traffic.
Trevor Norris22668db2013-07-08 23:53:41128 bytes += buffer.length;
isaacse82f9742013-02-08 03:13:26129 };
130
131 clientHandle.readStart();
132
133 // the meat of the benchmark is right here:
134 bench.start();
135
136 setTimeout(function() {
137 // report in Gb/sec
138 bench.end((bytes * 8) / (1024 * 1024 * 1024));
139 }, dur * 1000);
140 };
141}