1 var usage = 'node benchmark/compare.js ' +
2 '<node-binary1> <node-binary2> ' +
3 '[--html] [--red|-r] [--green|-g] ' +
4 '[-- <type> [testFilter]]';
11 for (var i = 2; i < process.argv.length; i++) {
12 var arg = process.argv[i];
14 case '--red': case '-r':
15 show = show === 'green' ? 'both' : 'red';
17 case '--green': case '-g':
18 show = show === 'red' ? 'both' : 'green';
23 case '-h': case '-?': case '--help':
31 if (Array.isArray(benchmarks))
41 var green = '\033[1;32m';
42 var red = '\033[1;31m';
46 var start = '<pre style="background-color:#333;color:#eee">';
47 var green = '<span style="background-color:#0f0;color:#000">';
48 var red = '<span style="background-color:#f00;color:#fff">';
49 var reset = '</span>';
53 var runBench = process.env.NODE_BENCH || 'bench';
55 if (nodes.length !== 2)
56 return console.error('usage:\n %s', usage);
58 var spawn = require('child_process').spawn;
61 var r = (+process.env.NODE_BENCH_RUNS || 1) * 2;
67 toggle = ++toggle % 2;
69 var node = nodes[toggle];
70 console.error('running %s', node);
72 for (var i in process.env)
73 env[i] = process.env[i];
78 if (Array.isArray(benchmarks) && benchmarks.length) {
81 ['benchmark/common.js'].concat(benchmarks),
85 child = spawn('make', [runBench], { env: env });
87 child.stdout.setEncoding('utf8');
88 child.stdout.on('data', function(c) {
92 child.stderr.pipe(process.stderr);
94 child.on('close', function(code) {
96 console.error('%s exited with code=%d', node, code);
99 out.trim().split(/\r?\n/).forEach(function(line) {
104 var s = line.split(':');
106 if (!num && num !== 0)
110 var res = results[line] = results[line] || {};
111 res[node] = res[node] || [];
121 // each result is an object with {"foo.js arg=bar":12345,...}
122 // compare each thing, and show which node did the best.
123 // node[0] is shown in green, node[1] shown in red.
124 var maxLen = -Infinity;
125 var util = require('util');
128 Object.keys(results).map(function(bench) {
129 var res = results[bench];
130 var n0 = avg(res[nodes[0]]);
131 var n1 = avg(res[nodes[1]]);
133 var pct = ((n0 - n1) / n1 * 100).toFixed(2);
135 var g = n0 > n1 ? green : '';
136 var r = n0 > n1 ? '' : red;
139 if (show === 'green' && !g || show === 'red' && !r)
142 var r0 = util.format(
146 n0.toPrecision(5), g ? reset : ''
148 var r1 = util.format(
152 n1.toPrecision(5), r ? reset : ''
154 pct = c + pct + '%' + reset;
156 var l = util.format('%s: %s %s', bench, r0, r1);
157 maxLen = Math.max(l.length + pct.length, maxLen);
159 }).filter(function(l) {
161 }).forEach(function(line) {
164 var dotLen = maxLen - l.length - pct.length + 2;
165 var dots = ' ' + new Array(Math.max(0, dotLen)).join('.') + ' ';
166 console.log(l + dots + pct);
172 if (list.length >= 3) {
174 var q = Math.floor(list.length / 4) || 1;
175 list = list.slice(q, -q);
177 return list.reduce(function(a, b) {