blob: c33c6d0f2abf85a078ec251185634d5a5c63efaf [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));
Andreas Madsen8bb59fd2016-05-31 19:49:1659 process.exit(0);
isaacse82f9742013-02-08 03:13:2660 }, dur * 1000);
61
Ben Noordhuisd75f67f2013-07-19 21:59:4162 clientHandle.onread = function(nread, buffer) {
isaacse82f9742013-02-08 03:13:2663 // we're not expecting to ever get an EOF from the client.
64 // just lots of data forever.
Ben Noordhuisd75f67f2013-07-19 21:59:4165 if (nread < 0)
66 fail(nread, 'read');
isaacse82f9742013-02-08 03:13:2667
68 // don't slice the buffer. the point of this is to isolate, not
69 // simulate real traffic.
Trevor Norris22668db2013-07-08 23:53:4170 bytes += buffer.length;
isaacse82f9742013-02-08 03:13:2671 };
72
73 clientHandle.readStart();
74 };
75
76 client();
77}
78
79function client() {
80 var chunk;
81 switch (type) {
82 case 'buf':
James M Snell85ab4a52016-01-25 23:00:0683 chunk = Buffer.alloc(len, 'x');
isaacse82f9742013-02-08 03:13:2684 break;
85 case 'utf':
86 chunk = new Array(len / 2 + 1).join('ΓΌ');
87 break;
88 case 'asc':
89 chunk = new Array(len + 1).join('x');
90 break;
91 default:
92 throw new Error('invalid type: ' + type);
isaacse82f9742013-02-08 03:13:2693 }
94
95 var clientHandle = new TCP();
Yosuke Furukawa3abfb562015-01-18 16:16:0596 var connectReq = new TCPConnectWrap();
Ben Noordhuisd75f67f2013-07-19 21:59:4197 var err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
isaacse82f9742013-02-08 03:13:2698
Ben Noordhuisd75f67f2013-07-19 21:59:4199 if (err)
100 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:26101
102 clientHandle.readStart();
103
Ben Noordhuisd75f67f2013-07-19 21:59:41104 connectReq.oncomplete = function(err) {
105 if (err)
106 fail(err, 'connect');
107
isaacse82f9742013-02-08 03:13:26108 while (clientHandle.writeQueueSize === 0)
109 write();
110 };
111
112 function write() {
Yosuke Furukawa3abfb562015-01-18 16:16:05113 var writeReq = new WriteWrap();
114 writeReq.oncomplete = afterWrite;
Ben Noordhuisd75f67f2013-07-19 21:59:41115 var err;
isaacse82f9742013-02-08 03:13:26116 switch (type) {
117 case 'buf':
Ben Noordhuisd75f67f2013-07-19 21:59:41118 err = clientHandle.writeBuffer(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26119 break;
120 case 'utf':
Ben Noordhuisd75f67f2013-07-19 21:59:41121 err = clientHandle.writeUtf8String(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26122 break;
123 case 'asc':
Ben Noordhuisd75f67f2013-07-19 21:59:41124 err = clientHandle.writeAsciiString(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26125 break;
126 }
127
Ben Noordhuisd75f67f2013-07-19 21:59:41128 if (err)
129 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26130 }
131
Ben Noordhuisd75f67f2013-07-19 21:59:41132 function afterWrite(err, handle, req) {
133 if (err)
134 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26135
136 while (clientHandle.writeQueueSize === 0)
137 write();
138 }
139}