blob: 3bbf082a41dbd91a39fc0f70e732c0ac14e84884 [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;
17var PORT = common.PORT;
18
19var dur;
20var len;
21var type;
22
23function main(conf) {
24 dur = +conf.dur;
25 len = +conf.len;
26 type = conf.type;
27 server();
28}
29
30
Ben Noordhuisd75f67f2013-07-19 21:59:4131function fail(err, syscall) {
32 throw util._errnoException(err, syscall);
isaacse82f9742013-02-08 03:13:2633}
34
35function server() {
36 var serverHandle = new TCP();
Ben Noordhuisd75f67f2013-07-19 21:59:4137 var err = serverHandle.bind('127.0.0.1', PORT);
38 if (err)
39 fail(err, 'bind');
isaacse82f9742013-02-08 03:13:2640
Ben Noordhuisd75f67f2013-07-19 21:59:4141 err = serverHandle.listen(511);
42 if (err)
43 fail(err, 'listen');
isaacse82f9742013-02-08 03:13:2644
Ben Noordhuisd75f67f2013-07-19 21:59:4145 serverHandle.onconnection = function(err, clientHandle) {
46 if (err)
47 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:2648
49 // the meat of the benchmark is right here:
50 bench.start();
51 var bytes = 0;
52
53 setTimeout(function() {
54 // report in Gb/sec
55 bench.end((bytes * 8) / (1024 * 1024 * 1024));
56 }, dur * 1000);
57
Ben Noordhuisd75f67f2013-07-19 21:59:4158 clientHandle.onread = function(nread, buffer) {
isaacse82f9742013-02-08 03:13:2659 // we're not expecting to ever get an EOF from the client.
60 // just lots of data forever.
Ben Noordhuisd75f67f2013-07-19 21:59:4161 if (nread < 0)
62 fail(nread, 'read');
isaacse82f9742013-02-08 03:13:2663
64 // don't slice the buffer. the point of this is to isolate, not
65 // simulate real traffic.
Trevor Norris22668db2013-07-08 23:53:4166 bytes += buffer.length;
isaacse82f9742013-02-08 03:13:2667 };
68
69 clientHandle.readStart();
70 };
71
72 client();
73}
74
75function client() {
76 var chunk;
77 switch (type) {
78 case 'buf':
79 chunk = new Buffer(len);
80 chunk.fill('x');
81 break;
82 case 'utf':
83 chunk = new Array(len / 2 + 1).join('ΓΌ');
84 break;
85 case 'asc':
86 chunk = new Array(len + 1).join('x');
87 break;
88 default:
89 throw new Error('invalid type: ' + type);
90 break;
91 }
92
93 var clientHandle = new TCP();
Ben Noordhuisd75f67f2013-07-19 21:59:4194 var connectReq = {};
95 var err = clientHandle.connect(connectReq, '127.0.0.1', PORT);
isaacse82f9742013-02-08 03:13:2696
Ben Noordhuisd75f67f2013-07-19 21:59:4197 if (err)
98 fail(err, 'connect');
isaacse82f9742013-02-08 03:13:2699
100 clientHandle.readStart();
101
Ben Noordhuisd75f67f2013-07-19 21:59:41102 connectReq.oncomplete = function(err) {
103 if (err)
104 fail(err, 'connect');
105
isaacse82f9742013-02-08 03:13:26106 while (clientHandle.writeQueueSize === 0)
107 write();
108 };
109
110 function write() {
Ben Noordhuisd75f67f2013-07-19 21:59:41111 var writeReq = { oncomplete: afterWrite };
112 var err;
isaacse82f9742013-02-08 03:13:26113 switch (type) {
114 case 'buf':
Ben Noordhuisd75f67f2013-07-19 21:59:41115 err = clientHandle.writeBuffer(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26116 break;
117 case 'utf':
Ben Noordhuisd75f67f2013-07-19 21:59:41118 err = clientHandle.writeUtf8String(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26119 break;
120 case 'asc':
Ben Noordhuisd75f67f2013-07-19 21:59:41121 err = clientHandle.writeAsciiString(writeReq, chunk);
isaacse82f9742013-02-08 03:13:26122 break;
123 }
124
Ben Noordhuisd75f67f2013-07-19 21:59:41125 if (err)
126 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26127 }
128
Ben Noordhuisd75f67f2013-07-19 21:59:41129 function afterWrite(err, handle, req) {
130 if (err)
131 fail(err, 'write');
isaacse82f9742013-02-08 03:13:26132
133 while (clientHandle.writeQueueSize === 0)
134 write();
135 }
136}