|
|
|
#!/usr/bin/env node
|
|
|
|
/*eslint no-console:0*/
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var path = require('path');
|
|
|
|
var fs = require('fs');
|
|
|
|
var util = require('util');
|
|
|
|
var Benchmark = require('benchmark');
|
|
|
|
var ansi = require('ansi');
|
|
|
|
var cursor = ansi(process.stdout);
|
|
|
|
|
|
|
|
var IMPLS_DIRECTORY = path.join(__dirname, 'implementations');
|
|
|
|
var IMPLS_PATHS = {};
|
|
|
|
var IMPLS = [];
|
|
|
|
|
|
|
|
|
|
|
|
fs.readdirSync(IMPLS_DIRECTORY).sort().forEach(function (name) {
|
|
|
|
var file = path.join(IMPLS_DIRECTORY, name);
|
|
|
|
var code = require(file);
|
|
|
|
|
|
|
|
IMPLS_PATHS[name] = file;
|
|
|
|
IMPLS.push({
|
|
|
|
name: name,
|
|
|
|
code: code
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
var SAMPLES_DIRECTORY = path.join(__dirname, 'samples');
|
|
|
|
var SAMPLES = [];
|
|
|
|
|
|
|
|
fs.readdirSync(SAMPLES_DIRECTORY).sort().forEach(function (sample) {
|
|
|
|
var filepath = path.join(SAMPLES_DIRECTORY, sample),
|
|
|
|
extname = path.extname(filepath),
|
|
|
|
basename = path.basename(filepath, extname);
|
|
|
|
|
|
|
|
var content = {};
|
|
|
|
|
|
|
|
content.string = fs.readFileSync(filepath, 'utf8');
|
|
|
|
|
|
|
|
var title = util.format('(%d bytes)', content.string.length);
|
|
|
|
|
|
|
|
function onComplete() {
|
|
|
|
cursor.write('\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var suite = new Benchmark.Suite(title, {
|
|
|
|
|
|
|
|
onStart: function onStart() {
|
|
|
|
console.log('\nSample: %s %s', sample, title);
|
|
|
|
},
|
|
|
|
|
|
|
|
onComplete: onComplete
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
IMPLS.forEach(function (impl) {
|
|
|
|
suite.add(impl.name, {
|
|
|
|
|
|
|
|
onCycle: function onCycle(event) {
|
|
|
|
cursor.horizontalAbsolute();
|
|
|
|
cursor.eraseLine();
|
|
|
|
cursor.write(' > ' + event.target);
|
|
|
|
},
|
|
|
|
|
|
|
|
onComplete: onComplete,
|
|
|
|
|
|
|
|
fn: function () {
|
|
|
|
impl.code.run(content.string);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
SAMPLES.push({
|
|
|
|
name: basename,
|
|
|
|
title: title,
|
|
|
|
content: content,
|
|
|
|
suite: suite
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
function select(patterns) {
|
|
|
|
var result = [];
|
|
|
|
|
|
|
|
if (!(patterns instanceof Array)) {
|
|
|
|
patterns = [ patterns ];
|
|
|
|
}
|
|
|
|
|
|
|
|
function checkName(name) {
|
|
|
|
return patterns.length === 0 || patterns.some(function (regexp) {
|
|
|
|
return regexp.test(name);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
SAMPLES.forEach(function (sample) {
|
|
|
|
if (checkName(sample.name)) {
|
|
|
|
result.push(sample);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function run(files) {
|
|
|
|
var selected = select(files);
|
|
|
|
|
|
|
|
if (selected.length > 0) {
|
|
|
|
console.log('Selected samples: (%d of %d)', selected.length, SAMPLES.length);
|
|
|
|
selected.forEach(function (sample) {
|
|
|
|
console.log(' > %s', sample.name);
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
console.log('There isn\'t any sample matches any of these patterns: %s', util.inspect(files));
|
|
|
|
}
|
|
|
|
|
|
|
|
selected.forEach(function (sample) {
|
|
|
|
sample.suite.run();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports.IMPLS_DIRECTORY = IMPLS_DIRECTORY;
|
|
|
|
module.exports.IMPLS_PATHS = IMPLS_PATHS;
|
|
|
|
module.exports.IMPLS = IMPLS;
|
|
|
|
module.exports.SAMPLES_DIRECTORY = SAMPLES_DIRECTORY;
|
|
|
|
module.exports.SAMPLES = SAMPLES;
|
|
|
|
module.exports.select = select;
|
|
|
|
module.exports.run = run;
|
|
|
|
|
|
|
|
run(process.argv.slice(2).map(function (source) {
|
|
|
|
return new RegExp(source, 'i');
|
|
|
|
}));
|