Browse Source

Add command-line runner for the benchmark suite

redux
David Majda 11 years ago
parent
commit
8e63ad3b6c
  1. 17
      benchmark/README
  2. 137
      benchmark/run

17
benchmark/README

@ -5,15 +5,15 @@ This is the PEG.js benchmark suite. It measures speed of the parsers generated
by PEG.js on various inputs. Its main goal is to provide data for code generator
optimization.
Running
-------
Running in a browser
--------------------
1. Start a web server and make it serve the PEG.js root directory (one level
up from this one).
2. Point your browser to an URL corresponding to the index.html file.
3. Wait for the table to fill :-)
3. Wait for the table to fill.
If you have Python installed, you can just run the following command in the
PEG.js root directory
@ -21,3 +21,14 @@ PEG.js root directory
python -m SimpleHTTPServer
and load http://localhost:8000/benchmark/ in your browser.
Running from a command-line
---------------------------
1. Make sure you have Node.js installed.
2. Run the following command:
./run
3. Wait for the table to fill.

137
benchmark/run

@ -0,0 +1,137 @@
#!/usr/bin/env node
var sys = require("sys");
var fs = require("fs");
var PEG = require("../lib/peg");
[
"benchmarks.js",
"runner.js",
].forEach(function(file) {
eval(fs.readFileSync(file, "utf8"));
});
/* Results Table Manipulation */
function dup(text, count) {
var result = "";
for (var i = 1; i <= count; i++) {
result += text;
}
return result;
}
function padLeft(text, length) {
return dup(" ", length - text.length) + text;
}
function padRight(text, length) {
return text + dup(" ", length - text.length);
}
function center(text, length) {
var padLength = (length - text.length) / 2;
return dup(" ", Math.floor(padLength))
+ text
+ dup(" ", Math.ceil(padLength));
}
function writeTableHeader() {
sys.puts("+-------------------------------------+-----------+-----------+--------------+");
sys.puts("| Test | Inp. size | Avg. time | Avg. speed |");
}
function writeHeading(heading) {
sys.puts("+-------------------------------------+-----------+-----------+--------------+");
sys.puts("| " + center(heading, 74) + " |");
sys.puts("+-------------------------------------+-----------+-----------+--------------+");
}
function writeResult(title, inputSize, parseTime) {
var KB = 1024;
var MS_IN_S = 1000;
sys.puts("| "
+ padRight(title, 35)
+ " | "
+ padLeft((inputSize / KB).toFixed(2), 6)
+ " kB | "
+ padLeft(parseTime.toFixed(2), 6)
+ " kB | "
+ padLeft(((inputSize / KB) / (parseTime / MS_IN_S)).toFixed(2), 7)
+ " kB/s |"
);
}
function writeSeparator() {
sys.puts("+-------------------------------------+-----------+-----------+--------------+");
}
function writeTableFooter() {
sys.puts("+-------------------------------------+-----------+-----------+--------------+");
}
/* Helpers */
function exitFailure() {
process.exit(1);
}
function abort(message) {
sys.error(message);
exitFailure();
}
/* Main */
var args = process.argv.slice(2); // Trim "node" and the script path.
switch (args.length) {
case 0:
var runCount = 10;
break;
case 1:
var runCount = parseInt(args[0]);
if (isNaN(runCount) || runCount <= 0) {
abort("Number of runs must be a positive integer.");
}
break;
default:
abort("Too many arguments.");
}
sys.puts("Each test is run " + runCount + " times.");
sys.puts("");
Runner.run(benchmarks, runCount, {
readFile: function(file) {
return fs.readFileSync(file, "utf-8");
},
testStart: function(benchmark, test) {
/* Nothing to do. */
},
testFinish: function(benchmark, test, inputSize, parseTime) {
writeResult(test.title, inputSize, parseTime);
},
benchmarkStart: function(benchmark) {
writeHeading(benchmark.title);
},
benchmarkFinish: function(benchmark, inputSize, parseTime) {
writeSeparator();
writeResult(benchmark.title + " total", inputSize, parseTime);
},
start: function() {
writeTableHeader();
},
finish: function(inputSize, parseTime) {
writeSeparator();
writeResult("Total", inputSize, parseTime);
writeTableFooter();
},
});
Loading…
Cancel
Save