summaryrefslogtreecommitdiff
path: root/perf
diff options
context:
space:
mode:
authorAlexander Early <alexander.early@gmail.com>2015-10-24 19:17:41 -0700
committerAlexander Early <alexander.early@gmail.com>2015-10-24 19:17:41 -0700
commita1fdd1cf87ca86ddcac71e744ab08899a84656cc (patch)
treef7836fa4bd029f3460212c3b538882ab20b83264 /perf
parent22e89cb5d5d3fd655e6af65750896f53a4f8e600 (diff)
parent04dec370886cbd11845bd30559465ca29bda14ef (diff)
downloadasync-a1fdd1cf87ca86ddcac71e744ab08899a84656cc.tar.gz
merge from megawac
Diffstat (limited to 'perf')
-rwxr-xr-xperf/benchmark.js97
1 files changed, 55 insertions, 42 deletions
diff --git a/perf/benchmark.js b/perf/benchmark.js
index c3fb4d2..beac00a 100755
--- a/perf/benchmark.js
+++ b/perf/benchmark.js
@@ -3,36 +3,49 @@
var _ = require("lodash");
var Benchmark = require("benchmark");
var exec = require("child_process").exec;
+var execSync = require("child_process").execSync;
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp");
var async = require("../");
var suiteConfigs = require("./suites");
+var semver = require("semver");
var args = require("yargs")
- .usage("Usage: $0 [options] [tag1] [tag2]")
- .describe("g", "run only benchmarks whose names match this regex")
- .alias("g", "grep")
- .default("g", ".*")
- .describe("i", "skip benchmarks whose names match this regex")
- .alias("i", "reject")
- .default("i", "^$")
- .describe("l", "maximum running time per test (in seconds)")
- .alias("l", "limit")
- .default("l", 2)
- .help('h')
- .alias('h', 'help')
- .example('$0 0.9.2 0.9.0', 'Compare v0.9.2 with v0.9.0')
- .example('$0 0.9.2', 'Compare v0.9.2 with the current working version')
- .example('$0', 'Compare the latest tag with the current working version')
- .example('$0 -g each', 'only run the each(), eachLimit() and eachSeries() benchmarks')
- .example('')
- .argv;
+ .usage("Usage: $0 [options] [tag1] [tag2]")
+ .describe("g", "run only benchmarks whose names match this regex")
+ .alias("g", "grep")
+ .default("g", ".*")
+ .describe("i", "skip benchmarks whose names match this regex")
+ .alias("i", "reject")
+ .default("i", "^$")
+ .describe("l", "maximum running time per test (in seconds)")
+ .alias("l", "limit")
+ .default("l", 2)
+ .help("h")
+ .alias("h", "help")
+ .example("$0 0.9.2 0.9.0", "Compare v0.9.2 with v0.9.0")
+ .example("$0 0.9.2", "Compare v0.9.2 with the current working version")
+ .example("$0", "Compare the latest tag with the current working version")
+ .example("$0 -g each", "only run the each(), eachLimit() and " +
+ "eachSeries() benchmarks")
+ .example("")
+ .argv;
var grep = new RegExp(args.g, "i");
var reject = new RegExp(args.i, "i");
-var version0 = args._[0] || require("../package.json").version;
+function getLatestVersion() {
+ var tags = execSync("git tag");
+ var latest = _(tags).split("\n")
+ .compact()
+ .sort(semver.gt)
+ .last();
+ console.log("Latest tag is ", latest);
+ return latest;
+}
+
+var version0 = args._[0] || getLatestVersion();
var version1 = args._[1] || "current";
var versionNames = [version0, version1];
var benchOptions = {defer: true, minSamples: 1, maxTime: +args.l};
@@ -52,12 +65,12 @@ async.eachSeries(versionNames, cloneVersion, function (err) {
versions = versionNames.map(requireVersion);
var suites = suiteConfigs
- .map(setDefaultOptions)
- .reduce(handleMultipleArgs, [])
- .map(setName)
- .filter(matchesGrep)
- .filter(doesNotMatch)
- .map(createSuite);
+ .map(setDefaultOptions)
+ .reduce(handleMultipleArgs, [])
+ .map(setName)
+ .filter(matchesGrep)
+ .filter(doesNotMatch)
+ .map(createSuite);
async.eachSeries(suites, runSuite, function () {
var totalTime0 = +totalTime[version0].toPrecision(3);
@@ -69,24 +82,24 @@ async.eachSeries(versionNames, cloneVersion, function (err) {
if ( Math.abs((totalTime0 / totalTime1) - 1) < 0.01) {
// if < 1% difference, we're likely within the margins of error
console.log("Both versions are about equal " +
- "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
+ "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
} else if (totalTime0 < totalTime1) {
console.log(version0 + " faster overall " +
- "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
+ "(" + totalTime0 + "ms total vs. " + totalTime1 + "ms total)");
} else if (totalTime1 < totalTime0) {
console.log(version1 + " faster overall " +
- "(" + totalTime1 + "ms total vs. " + totalTime0 + "ms total)");
+ "(" + totalTime1 + "ms total vs. " + totalTime0 + "ms total)");
}
if (wins0 > wins1) {
console.log(version0 + " won more benchmarks " +
- "(" + wins0 + " vs. " + wins1 + ")");
+ "(" + wins0 + " vs. " + wins1 + ")");
} else if (wins1 > wins0) {
console.log(version1 + " won more benchmarks " +
- "(" + wins1 + " vs. " + wins0 + ")");
+ "(" + wins1 + " vs. " + wins0 + ")");
} else {
console.log("Both versions won the same number of benchmarks " +
- "(" + wins0 + " vs. " + wins1 + ")");
+ "(" + wins0 + " vs. " + wins1 + ")");
}
});
});
@@ -158,22 +171,22 @@ function createSuite(suiteConfig) {
return suite.on('cycle', function(event) {
var mean = event.target.stats.mean * 1000;
- console.log(event.target + ", " + (+mean.toPrecision(3)) + "ms per run");
+ console.log(event.target + ", " + mean.toPrecision(3) + "ms per run");
var version = event.target.options.versionName;
if (errored) return;
totalTime[version] += mean;
})
.on('error', function (err) { console.error(err); })
- .on('complete', function() {
- if (!errored) {
- var fastest = this.filter('fastest');
- if (fastest.length === 2) {
- console.log("Tie");
- } else {
- var winner = fastest[0].options.versionName;
- console.log(winner + ' is faster');
- wins[winner]++;
- }
+ .on('complete', function() {
+ if (!errored) {
+ var fastest = this.filter('fastest');
+ if (fastest.length === 2) {
+ console.log("Tie");
+ } else {
+ var winner = fastest[0].options.versionName;
+ console.log(winner + ' is faster');
+ wins[winner]++;
+ }
}
console.log("--------------------------------------");
});