/
bench.js
124 lines (106 loc) · 3.44 KB
/
bench.js
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env node
'use strict';
var fork = require('child_process').fork;
var ora = require('ora');
var path = require('path');
var autocannon = require('./autocannon');
var pipeline = require('vasync').pipeline;
function runBenchmark(opts, handler, version, cb) {
if (opts.track) {
console.log(version.toUpperCase() + ':');
}
var spinner = ora('Started ' + version + '/' + handler).start();
var modulePath = path.join(__dirname, '../benchmarks', handler);
var url = require(modulePath).url;
var forked = fork(modulePath, ['version=' + version]);
pipeline(
{
funcs: [
function warm(_, callback) {
spinner.color = 'magenta';
spinner.text =
'Warming ' + version + '/' + handler + ' for 5s';
var fireOpts = Object.assign({}, opts, {
duration: 5,
url: url
});
autocannon.fire(
fireOpts,
handler,
version,
false,
callback
);
},
function benchmark(_, callback) {
if (opts.track) {
spinner.stop();
} else {
spinner.color = 'yellow';
spinner.text =
'Benchmarking ' +
version +
'/' +
handler +
' for ' +
opts.duration +
's';
}
var fireOpts = Object.assign({}, opts, { url: url });
autocannon.fire(fireOpts, handler, version, true, callback);
}
]
},
function onPipelineFinished(err) {
forked.kill('SIGINT');
if (err) {
spinner.fail();
cb(err);
return;
}
spinner.text = 'Results saved for ' + version + '/' + handler;
spinner.succeed();
cb();
}
);
}
function start(opts, list, index) {
index = index || 0;
// No more item
if (list.length === index) {
return;
}
var handler = list[index];
console.log('---- ' + handler + ' ----');
pipeline(
{
funcs: [
function head(_, callback) {
runBenchmark(opts, handler, 'head', callback);
},
function stable(_, callback) {
if (!opts.compare) {
callback();
return;
}
runBenchmark(opts, handler, 'stable', callback);
}
]
},
function onPipelineFinished(err) {
if (err) {
console.log(err);
return;
}
// Compare versions
if (opts.compare) {
var result = autocannon.compare(handler);
console.log(handler + ' throughput:');
console.log(JSON.stringify(result.throughput, null, 4) + '\n');
}
// Benchmark next handler
start(opts, list, ++index);
}
);
}
module.exports = start;