node-query/node_modules/mysql2/benchmarks/run-unit.js

135 lines
3.5 KiB
JavaScript
Raw Normal View History

2015-01-28 15:33:44 -05:00
#!/usr/bin/env node
var progress = require('progress');
var fs = require('fs');
var nWarmup = 2;
var nRepeats = 32 + nWarmup;
var path = require('path');
var prevResults = {};
try {
var r = require('./results.json');
r.forEach(function(rr) {
prevResults[rr.path] = rr
});
} catch(e) {
// no prev results?
}
function stats(times) {
var avg = 0;
for(var i=0; i < times.length; ++i) {
avg += times[i]/times.length;
}
var v = 0;
for(var i=0; i < times.length; ++i) {
v += (times[i] - avg)*(times[i] - avg) / times.length;
}
var stdev = Math.sqrt(v);
return {
avg: avg,
stdev: stdev,
stdevrel: stdev/avg
};
}
function runFolder(name, done) {
fs.readdir(name, function(err, list) {
if (err)
return done(err);
runFileList(name, list, done);
});
}
function benchmarkModule(m, modulePath, done) {
var results = [];
var bar = new progress(m.comment + ' [:bar] ', {
total: nRepeats,
clear: true
});
function repeat(w, n) {
bar.tick();
if (n === 0) {
var result = {};
var s = stats(results);
var unsDigits = Math.floor(Math.floor(s.stdev).toString().length * 0.8);
var pow = Math.pow(10, unsDigits);
var avg = Math.round(s.avg / pow)*pow;
var uns = Math.round(s.stdev / pow)*pow;
console.log('%s: %s ±%s', m.comment, avg, uns);
result.time = s.avg;
result.timeStdev = s.stdev;
result.comment = m.comment;
result.path = path.relative(__dirname, modulePath);
if (m.toSpeed) {
var speed = m.toSpeed(s.avg, s.stdev);
var speedDigits = Math.floor(Math.floor(speed.error).toString().length * 0.8);
pow = Math.pow(10, speedDigits);
console.log(' = %s ±%s %s',
Math.round(speed.value / pow)*pow,
Math.round(speed.error / pow)*pow, speed.units);
var prev = prevResults[result.path];
if (prev) {
if (speed.value > prev.speed.value + prev.speed.error) {
console.log('Faster then prev result: %s ±%s %s', prev.speed.value, prev.speed.units)
} else if (speed.value < prev.speed.value - prev.speed.error) {
console.log('Slower then prev result: %s ±%s %s', prev.speed.value, prev.speed.units)
}
}
result.speed = speed;
}
return done(null, result);
}
var start = process.hrtime();
setImmediate(function() {
m(function() {
var end = process.hrtime(start);
if (w <= 0)
results.push(end[0]*1e9 + end[1]);
repeat(w-1, n-1);
});
});
}
repeat(nWarmup-1, nRepeats-1, done);
}
function runFileList(base, list, done) {
var index = -1;
var results;
function runOne(err, res) {
if (err) return done(err);
++index;
if (res) {
if (!results)
results = [];
if (Array.isArray(res))
results = results.concat(res);
else
results.push(res);
}
if (index >= list.length) {
return done(null, results);
}
var fname = base + '/' + list[index];
fs.stat(fname, function(err, stat) {
if (err) return done(err);
if (stat.isDirectory())
return runFolder(fname, runOne);
else if (fname.slice(-3) == '.js') {
var m = require(fname);
return benchmarkModule(m, fname, runOne);
}
runOne();
});
}
runOne();
}
//var name = process.argv[2] || __dirname + '/unit';
runFolder(__dirname + '/unit', function(err, results) {
//console.log(results);
fs.writeFileSync(__dirname + '/results.json', JSON.stringify(results));
});