mirror of
https://github.com/nodejs/node.git
synced 2024-12-01 16:10:02 +01:00
bench: A compare script for analyzing benchmarks
This commit is contained in:
parent
37077de83d
commit
aa2edd4b89
116
benchmark/compare.js
Normal file
116
benchmark/compare.js
Normal file
@ -0,0 +1,116 @@
|
||||
var usage = 'node benchmark/compare.js <node-binary1> <node-binary2>';
|
||||
|
||||
var show = 'both';
|
||||
var nodes = [];
|
||||
for (var i = 2; i < process.argv.length; i++) {
|
||||
var arg = process.argv[i];
|
||||
switch (arg) {
|
||||
case '--red': case '-r':
|
||||
show = show === 'green' ? 'both' : 'red';
|
||||
break;
|
||||
case '--green': case '-g':
|
||||
show = show === 'red' ? 'both' : 'green';
|
||||
break;
|
||||
default:
|
||||
nodes.push(arg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var runBench = process.env.NODE_BENCH || 'bench';
|
||||
|
||||
if (nodes.length !== 2)
|
||||
return console.error('usage:\n %s', usage);
|
||||
|
||||
var spawn = require('child_process').spawn;
|
||||
var results = {};
|
||||
var n = 2;
|
||||
|
||||
run();
|
||||
|
||||
function run() {
|
||||
if (n === 0)
|
||||
return compare();
|
||||
|
||||
n--;
|
||||
|
||||
var node = nodes[n];
|
||||
console.error('running %s', node);
|
||||
var env = {};
|
||||
for (var i in process.env)
|
||||
env[i] = process.env[i];
|
||||
env.NODE = node;
|
||||
var child = spawn('make', [ runBench ], { env: env });
|
||||
|
||||
var out = '';
|
||||
child.stdout.setEncoding('utf8');
|
||||
child.stdout.on('data', function(c) {
|
||||
out += c;
|
||||
});
|
||||
|
||||
child.stderr.pipe(process.stderr);
|
||||
|
||||
child.on('close', function(code) {
|
||||
if (code) {
|
||||
console.error('%s exited with code=%d', node, code);
|
||||
process.exit(code);
|
||||
} else {
|
||||
out.trim().split(/\r?\n/).forEach(function(line) {
|
||||
line = line.trim();
|
||||
if (!line)
|
||||
return;
|
||||
|
||||
var s = line.split(':');
|
||||
var num = +s.pop();
|
||||
if (!num && num !== 0)
|
||||
return
|
||||
|
||||
line = s.join(':');
|
||||
var res = results[line] = results[line] || {};
|
||||
res[node] = num;
|
||||
});
|
||||
|
||||
run();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function compare() {
|
||||
// each result is an object with {"foo.js arg=bar":12345,...}
|
||||
// compare each thing, and show which node did the best.
|
||||
// node[0] is shown in green, node[1] shown in red.
|
||||
var green = '\033[1;32m';
|
||||
var red = '\033[1;31m';
|
||||
var reset = '\033[m';
|
||||
var maxLen = -Infinity;
|
||||
var util = require('util');
|
||||
Object.keys(results).map(function(bench) {
|
||||
var res = results[bench];
|
||||
var n0 = res[nodes[0]];
|
||||
var n1 = res[nodes[1]];
|
||||
|
||||
var pct = ((n0 - n1) / ((n0 + n1) / 2) * 100).toFixed(2);
|
||||
|
||||
var g = n0 > n1 ? green : '';
|
||||
var r = n0 > n1 ? '' : red;
|
||||
var c = r || g;
|
||||
|
||||
if (show === 'green' && !g || show === 'red' && !r)
|
||||
return;
|
||||
|
||||
var r0 = util.format('%s%s: %d%s', g, nodes[0], n0, reset);
|
||||
var r1 = util.format('%s%s: %d%s', r, nodes[1], n1, reset);
|
||||
var pct = c + pct + '%' + reset;
|
||||
var l = util.format('%s: %s %s', bench, r0, r1);
|
||||
maxLen = Math.max(l.length + pct.length, maxLen);
|
||||
return [l, pct];
|
||||
}).filter(function(l) {
|
||||
return l;
|
||||
}).forEach(function(line) {
|
||||
var l = line[0];
|
||||
var pct = line[1];
|
||||
var dotLen = maxLen - l.length - pct.length + 2;
|
||||
var dots = ' ' + new Array(Math.max(0, dotLen)).join('.') + ' ';
|
||||
console.log(l + dots + pct);
|
||||
});
|
||||
}
|
Loading…
Reference in New Issue
Block a user