blob: e9dd7ca662009c23fefb7920a3256d267465009b [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
33
Ben Noordhuisd75f67f2013-07-19 21:59:4134function fail(err, syscall) {
35 throw util._errnoException(err, syscall);
isaacse82f9742013-02-08 03:13:2636}
37
38function server() {
39 var serverHandle = new TCP();
Ben Noordhuisd75f67f2013-07-19 21:59:4140 var err = serverHandle.bind('127.0.0.1', PORT);
41 if (err)
42 fail(err, 'bind');
isaacse82f9742013-02-08 03:13:2643
Ben Noordhuisd75f67f2013-07-19 21:59:4144 err = serverHandle.listen(511);
45 if (err)
46 fail(err, 'listen');
isaacse82f9742013-02-08 03:13:2647
Ben Noordhuisd75f67f2013-07-19 21:59:4148 serverHandle.onconnection = function(err, clientHandle) {
49 if (err)
50 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:2651
52 // the meat of the benchmark is right here:
53 bench.start();
54 var bytes = 0;
55
56 setTimeout(function() {
57 // report in Gb/sec
58 bench.end((bytes * 8) / (1024 * 1024 * 1024));
59 }, dur * 1000);
60
Ben Noordhuisd75f67f2013-07-19 21:59:4161 clientHandle.onread = function(nread, buffer) {
isaacse82f9742013-02-08 03:13:2662 // we're not expecting to ever get an EOF from the client.
63 // just lots of data forever.
Ben Noordhuisd75f67f2013-07-19 21:59:4164 if (nread < 0)
65 fail(nread, 'read');
isaacse82f9742013-02-08 03:13:2666
67 // don't slice the buffer. the point of this is to isolate, not
68 // simulate real traffic.
Trevor Norris22668db2013-07-08 23:53:4169 bytes += buffer.length;
isaacse82f9742013-02-08 03:13:2670 };
71
72 clientHandle.readStart();
73 };
74
75 client();
76}
77
78function client() {
79 var chunk;
80 switch (type) {
81 case 'buf':
James M Snell85ab4a52016-01-25 23:00:0682 chunk = Buffer.alloc(len, 'x');
isaacse82f9742013-02-08 03:13:2683 break;
84 case 'utf':
85 chunk = new Array(len / 2 + 1).join('ΓΌ');
86 break;
87 case 'asc':
88 chunk = new Array(len + 1).join('x');
89 break;
90 default:
91 throw new Error('invalid type: ' + type);
isaacse82f9742013-02-08 03:13:2692 }
93
94 var clientHandle = new TCP();
Yosuke Furukawa3abfb562015-01-18 16:16:0595 var connectReq = new TCPConnectWrap();
Ben Noordhuisd75f67f2013-07-19 21:59:4196 var err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
isaacse82f9742013-02-08 03:13:2697
Ben Noordhuisd75f67f2013-07-19 21:59:4198 if (err)
99 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:26100
101 clientHandle.readStart();
102
Ben Noordhuisd75f67f2013-07-19 21:59:41103 connectReq.oncomplete = function(err) {
104 if (err)
105 fail(err, 'connect');
106
isaacse82f9742013-02-08 03:13:26107 while (clientHandle.writeQueueSize === 0)
108 write();
109 };
110
111 function write() {
Yosuke Furukawa3abfb562015-01-18 16:16:05112 var writeReq = new WriteWrap();
113 writeReq.oncomplete = afterWrite;
Ben Noordhuisd75f67f2013-07-19 21:59:41114 var err;
isaacse82f9742013-02-08 03:13:26115 switch (type) {
116 case 'buf':
Ben Noordhuisd75f67f2013-07-19 21:59:41117 err = clientHandle.writeBuffer(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26118 break;
119 case 'utf':
Ben Noordhuisd75f67f2013-07-19 21:59:41120 err = clientHandle.writeUtf8String(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26121 break;
122 case 'asc':
Ben Noordhuisd75f67f2013-07-19 21:59:41123 err = clientHandle.writeAsciiString(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26124 break;
125 }
126
Ben Noordhuisd75f67f2013-07-19 21:59:41127 if (err)
128 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26129 }
130
Ben Noordhuisd75f67f2013-07-19 21:59:41131 function afterWrite(err, handle, req) {
132 if (err)
133 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26134
135 while (clientHandle.writeQueueSize === 0)
136 write();
137 }
138}