aboutsummaryrefslogtreecommitdiff
path: root/benchmark/client_latency.js
blob: 09630a0da85c4147a2d42bfc3e9772325215799c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// first start node http_simple.js
var http = require('http');

var latency = [];

var numRequests = parseInt(process.argv[2], 10) || 100;
var maxSockets = parseInt(process.argv[3], 10) || 100;
var runs = parseInt(process.argv[4], 10) || 100;
var prefix = process.argv[5] || '';
if (prefix) prefix += '_';
var r = 0;

var port = parseInt(process.env.PORT, 10) || 8000;
var host = process.env.HOST || '127.0.0.1';

http.globalAgent.maxSockets = maxSockets;

run();

function run() {
  if (r++ === runs) {
    return finish();
  }

  // make numRequests in parallel
  // retain the order in which they are *made*.  This requires trapping
  // each one in a closure, since otherwise, we'll of course end
  // up mostly sorting them in ascending order, since the cb from a
  // fast request will almost always be called before the cb from a
  // slow one.
  var c = numRequests;
  var lat = [];
  latency.push(lat);
  for (var i = 0; i < numRequests; i++) (function (i) {
    makeRequest(function(l) {
      lat[i] = l;
      c--;
      if (c === 0) run();
    });
  })(i);
}

function makeRequest(cb) {
  var opts = { host: host,
               port: port,
               uri: 'http://'+host+':'+port+'/bytes/12',
               forever: true,
               path: '/bytes/12' };
  var pre = Date.now();
  var req = http.get(opts, function(res) {
    return cb(Date.now() - pre);
  });
}

function finish() {
  var data = [];
  latency.forEach(function(run, i) {
    run.forEach(function(l, j) {
      data[j] = data[j] || [];
      data[j][i] = l;
    });
  });

  data = data.map(function (l, i) {
    return l.join('\t')
  }).join('\n') + '\n';

  var fname = prefix +
              'client_latency_' +
              numRequests + '_' +
              maxSockets + '_' +
              runs + '.tab';
  var path = require('path');
  fname = path.resolve(__dirname, '..', 'out', fname);
  fname = path.relative(process.cwd(), fname);
  require('fs').writeFile(fname, data, function(er) {
    if (er) throw er;
    console.log('written: %s', fname);
  });
}