blob: b3576ba4acc637488ceccaccb2727f47aeb1d70a [file] [log] [blame]
isaacs087c4372013-02-13 18:47:291var usage = 'node benchmark/compare.js <node-binary1> <node-binary2> [--html] [--red|-r] [--green|-g]';
isaacsaa2edd42013-02-12 07:28:482
3var show = 'both';
4var nodes = [];
isaacs087c4372013-02-13 18:47:295var html = false;
6
isaacsaa2edd42013-02-12 07:28:487for (var i = 2; i < process.argv.length; i++) {
8 var arg = process.argv[i];
9 switch (arg) {
10 case '--red': case '-r':
11 show = show === 'green' ? 'both' : 'red';
12 break;
13 case '--green': case '-g':
14 show = show === 'red' ? 'both' : 'green';
15 break;
isaacs087c4372013-02-13 18:47:2916 case '--html':
17 html = true;
18 break;
19 case '-h': case '-?': case '--help':
20 console.log(usage);
21 process.exit(0);
isaacsaa2edd42013-02-12 07:28:4822 default:
23 nodes.push(arg);
24 break;
25 }
26}
27
isaacs087c4372013-02-13 18:47:2928if (!html) {
29 var start = '';
30 var green = '\033[1;32m';
31 var red = '\033[1;31m';
32 var reset = '\033[m';
33 var end = '';
34} else {
35 var start = '<pre style="background-color:#333;color:#eee">';
36 var green = '<span style="background-color:#0f0;color:#000">';
isaacs053e02e2013-02-20 17:17:2937 var red = '<span style="background-color:#f00;color:#fff">';
isaacs087c4372013-02-13 18:47:2938 var reset = '</span>';
39 var end = '</pre>';
40}
41
isaacsaa2edd42013-02-12 07:28:4842var runBench = process.env.NODE_BENCH || 'bench';
43
44if (nodes.length !== 2)
45 return console.error('usage:\n %s', usage);
46
47var spawn = require('child_process').spawn;
48var results = {};
49var n = 2;
50
51run();
52
53function run() {
54 if (n === 0)
55 return compare();
56
57 n--;
58
59 var node = nodes[n];
60 console.error('running %s', node);
61 var env = {};
62 for (var i in process.env)
63 env[i] = process.env[i];
64 env.NODE = node;
65 var child = spawn('make', [ runBench ], { env: env });
66
67 var out = '';
68 child.stdout.setEncoding('utf8');
69 child.stdout.on('data', function(c) {
70 out += c;
71 });
72
73 child.stderr.pipe(process.stderr);
74
75 child.on('close', function(code) {
76 if (code) {
77 console.error('%s exited with code=%d', node, code);
78 process.exit(code);
79 } else {
80 out.trim().split(/\r?\n/).forEach(function(line) {
81 line = line.trim();
82 if (!line)
83 return;
84
85 var s = line.split(':');
86 var num = +s.pop();
87 if (!num && num !== 0)
88 return
89
90 line = s.join(':');
91 var res = results[line] = results[line] || {};
92 res[node] = num;
93 });
94
95 run();
96 }
97 });
98}
99
100function compare() {
101 // each result is an object with {"foo.js arg=bar":12345,...}
102 // compare each thing, and show which node did the best.
103 // node[0] is shown in green, node[1] shown in red.
isaacsaa2edd42013-02-12 07:28:48104 var maxLen = -Infinity;
105 var util = require('util');
isaacs087c4372013-02-13 18:47:29106 console.log(start);
107
isaacsaa2edd42013-02-12 07:28:48108 Object.keys(results).map(function(bench) {
109 var res = results[bench];
110 var n0 = res[nodes[0]];
111 var n1 = res[nodes[1]];
112
isaacs035aa6b2013-02-13 18:48:55113 var pct = ((n0 - n1) / n1 * 100).toFixed(2);
isaacsaa2edd42013-02-12 07:28:48114
115 var g = n0 > n1 ? green : '';
116 var r = n0 > n1 ? '' : red;
117 var c = r || g;
118
119 if (show === 'green' && !g || show === 'red' && !r)
120 return;
121
122 var r0 = util.format('%s%s: %d%s', g, nodes[0], n0, reset);
123 var r1 = util.format('%s%s: %d%s', r, nodes[1], n1, reset);
124 var pct = c + pct + '%' + reset;
125 var l = util.format('%s: %s %s', bench, r0, r1);
126 maxLen = Math.max(l.length + pct.length, maxLen);
127 return [l, pct];
128 }).filter(function(l) {
129 return l;
130 }).forEach(function(line) {
131 var l = line[0];
132 var pct = line[1];
133 var dotLen = maxLen - l.length - pct.length + 2;
134 var dots = ' ' + new Array(Math.max(0, dotLen)).join('.') + ' ';
135 console.log(l + dots + pct);
136 });
isaacs087c4372013-02-13 18:47:29137 console.log(end);
isaacsaa2edd42013-02-12 07:28:48138}