From 7a94f97b46fd8e7a29806d8ac19be235f0bb5d12 Mon Sep 17 00:00:00 2001 From: Arlo Breault Date: Mon, 8 Jun 2015 10:46:28 -0700 Subject: [PATCH] Convert benchmark files to modules --- benchmark/benchmarks.js | 84 ++++++++-------- benchmark/run | 8 +- benchmark/runner.js | 206 +++++++++++++++++++++------------------- 3 files changed, 157 insertions(+), 141 deletions(-) diff --git a/benchmark/benchmarks.js b/benchmark/benchmarks.js index 6410cfa..6268583 100644 --- a/benchmark/benchmarks.js +++ b/benchmark/benchmarks.js @@ -1,38 +1,48 @@ -benchmarks = [ - { - id: "json", - title: "JSON", - tests: [ - { file: "example1.json", title: "Example 1" }, - { file: "example2.json", title: "Example 2" }, - { file: "example3.json", title: "Example 3" }, - { file: "example4.json", title: "Example 4" }, - { file: "example5.json", title: "Example 5" } - ] - }, - { - id: "css", - title: "CSS", - tests: [ - { file: "blueprint/src/reset.css", title: "Blueprint - reset.css (source)" }, - { file: "blueprint/src/typography.css", title: "Blueprint - typography.css (source)" }, - { file: "blueprint/src/forms.css", title: "Blueprint - forms.css (source)" }, - { file: "blueprint/src/grid.css", title: "Blueprint - grid.css (source)" }, - { file: "blueprint/src/print.css", title: "Blueprint - print.css (source)" }, - // Contains syntax errors. - // { file: "blueprint/src/ie.css", title: "Blueprint - ie.css (source)" }, - { file: "blueprint/min/screen.css", title: "Blueprint - screen.css (minified)" }, - { file: "blueprint/min/print.css", title: "Blueprint - print.css (minified)" }, - // Contains syntax errors. - // { file: "blueprint/min/ie.css", title: "Blueprint - ie.css (minified)" }, - { file: "960.gs/src/reset.css", title: "960.gs - reset.css (source)" }, - { file: "960.gs/src/text.css", title: "960.gs - text.css (source)" }, - { file: "960.gs/src/960.css", title: "960.gs - 960.css (source)" }, - { file: "960.gs/src/960_24_col.css", title: "960.gs - 960_24_col.css (source)" }, - { file: "960.gs/min/reset.css", title: "960.gs - reset.css (minified)" }, - { file: "960.gs/min/text.css", title: "960.gs - text.css (minified)" }, - { file: "960.gs/min/960.css", title: "960.gs - 960.css (minified)" }, - { file: "960.gs/min/960_24_col.css", title: "960.gs - 960_24_col.css (minified)" } - ] +(function(root, factory) { + if (typeof module !== 'undefined' && module.exports) { + module.exports = factory(); + } else { + root.benchmarks = factory(); } -]; +}(this, function() { + + return [ + { + id: "json", + title: "JSON", + tests: [ + { file: "example1.json", title: "Example 1" }, + { file: "example2.json", title: "Example 2" }, + { file: "example3.json", title: "Example 3" }, + { file: "example4.json", title: "Example 4" }, + { file: "example5.json", title: "Example 5" } + ] + }, + { + id: "css", + title: "CSS", + tests: [ + { file: "blueprint/src/reset.css", title: "Blueprint - reset.css (source)" }, + { file: "blueprint/src/typography.css", title: "Blueprint - typography.css (source)" }, + { file: "blueprint/src/forms.css", title: "Blueprint - forms.css (source)" }, + { file: "blueprint/src/grid.css", title: "Blueprint - grid.css (source)" }, + { file: "blueprint/src/print.css", title: "Blueprint - print.css (source)" }, + // Contains syntax errors. + // { file: "blueprint/src/ie.css", title: "Blueprint - ie.css (source)" }, + { file: "blueprint/min/screen.css", title: "Blueprint - screen.css (minified)" }, + { file: "blueprint/min/print.css", title: "Blueprint - print.css (minified)" }, + // Contains syntax errors. + // { file: "blueprint/min/ie.css", title: "Blueprint - ie.css (minified)" }, + { file: "960.gs/src/reset.css", title: "960.gs - reset.css (source)" }, + { file: "960.gs/src/text.css", title: "960.gs - text.css (source)" }, + { file: "960.gs/src/960.css", title: "960.gs - 960.css (source)" }, + { file: "960.gs/src/960_24_col.css", title: "960.gs - 960_24_col.css (source)" }, + { file: "960.gs/min/reset.css", title: "960.gs - reset.css (minified)" }, + { file: "960.gs/min/text.css", title: "960.gs - text.css (minified)" }, + { file: "960.gs/min/960.css", title: "960.gs - 960.css (minified)" }, + { file: "960.gs/min/960_24_col.css", title: "960.gs - 960_24_col.css (minified)" } + ] + } + ]; + +})); diff --git a/benchmark/run b/benchmark/run index 9c5afcb..e62c330 100755 --- a/benchmark/run +++ b/benchmark/run @@ -4,12 +4,8 @@ var util = require("util"); var fs = require("fs"); var PEG = require("../lib/peg"); -[ - "benchmarks.js", - "runner.js", -].forEach(function(file) { - eval(fs.readFileSync(__dirname + "/" + file, "utf8")); -}); +var benchmarks = require("./benchmarks.js"); +var Runner = require("./runner.js")(PEG); /* Results Table Manipulation */ diff --git a/benchmark/runner.js b/benchmark/runner.js index f8ad443..0644315 100644 --- a/benchmark/runner.js +++ b/benchmark/runner.js @@ -1,119 +1,129 @@ -Runner = { - run: function(benchmarks, runCount, options, callbacks) { +(function(root, factory) { + if (typeof module !== 'undefined' && module.exports) { + module.exports = factory; + } else { + root.Runner = factory(root.PEG); + } +}(this, function(PEG) { + + return { + run: function(benchmarks, runCount, options, callbacks) { - /* Queue */ + /* Queue */ - var Q = { - functions: [], + var Q = { + functions: [], - add: function(f) { - this.functions.push(f); - }, + add: function(f) { + this.functions.push(f); + }, - run: function() { - if (this.functions.length > 0) { - this.functions.shift()(); + run: function() { + if (this.functions.length > 0) { + this.functions.shift()(); - /* - * We can't use |arguments.callee| here because |this| would get - * messed-up in that case. - */ - setTimeout(function() { Q.run(); }, 0); + /* + * We can't use |arguments.callee| here because |this| would get + * messed-up in that case. + */ + setTimeout(function() { Q.run(); }, 0); + } } - } - }; + }; + + /* + * The benchmark itself is factored out into several functions (some of them + * generated), which are enqueued and run one by one using |setTimeout|. We + * do this for two reasons: + * + * 1. To avoid bowser mechanism for interrupting long-running scripts to + * kick-in (or at least to not kick-in that often). + * + * 2. To ensure progressive rendering of results in the browser (some + * browsers do not render at all when running JavaScript code). + * + * The enqueued functions share state, which is all stored in the properties + * of the |state| object. + */ + + var state = {}, i, j; + + function initialize() { + callbacks.start(); + + state.totalInputSize = 0; + state.totalParseTime = 0; + } - /* - * The benchmark itself is factored out into several functions (some of them - * generated), which are enqueued and run one by one using |setTimeout|. We - * do this for two reasons: - * - * 1. To avoid bowser mechanism for interrupting long-running scripts to - * kick-in (or at least to not kick-in that often). - * - * 2. To ensure progressive rendering of results in the browser (some - * browsers do not render at all when running JavaScript code). - * - * The enqueued functions share state, which is all stored in the properties - * of the |state| object. - */ - - var state = {}, i, j; - - function initialize() { - callbacks.start(); - - state.totalInputSize = 0; - state.totalParseTime = 0; - } + function benchmarkInitializer(i) { + return function() { + callbacks.benchmarkStart(benchmarks[i]); - function benchmarkInitializer(i) { - return function() { - callbacks.benchmarkStart(benchmarks[i]); - - state.parser = PEG.buildParser( - callbacks.readFile("../examples/" + benchmarks[i].id + ".pegjs"), - options - ); - state.benchmarkInputSize = 0; - state.benchmarkParseTime = 0; - }; - } + state.parser = PEG.buildParser( + callbacks.readFile("../examples/" + benchmarks[i].id + ".pegjs"), + options + ); + state.benchmarkInputSize = 0; + state.benchmarkParseTime = 0; + }; + } - function testRunner(i, j) { - return function() { - var benchmark = benchmarks[i], - test = benchmark.tests[j], - input, parseTime, averageParseTime, k, t; + function testRunner(i, j) { + return function() { + var benchmark = benchmarks[i], + test = benchmark.tests[j], + input, parseTime, averageParseTime, k, t; - callbacks.testStart(benchmark, test); + callbacks.testStart(benchmark, test); - input = callbacks.readFile(benchmark.id + "/" + test.file); + input = callbacks.readFile(benchmark.id + "/" + test.file); - parseTime = 0; - for (k = 0; k < runCount; k++) { - t = (new Date()).getTime(); - state.parser.parse(input); - parseTime += (new Date()).getTime() - t; - } - averageParseTime = parseTime / runCount; + parseTime = 0; + for (k = 0; k < runCount; k++) { + t = (new Date()).getTime(); + state.parser.parse(input); + parseTime += (new Date()).getTime() - t; + } + averageParseTime = parseTime / runCount; - callbacks.testFinish(benchmark, test, input.length, averageParseTime); + callbacks.testFinish(benchmark, test, input.length, averageParseTime); - state.benchmarkInputSize += input.length; - state.benchmarkParseTime += averageParseTime; - }; - } + state.benchmarkInputSize += input.length; + state.benchmarkParseTime += averageParseTime; + }; + } - function benchmarkFinalizer(i) { - return function() { - callbacks.benchmarkFinish( - benchmarks[i], - state.benchmarkInputSize, - state.benchmarkParseTime - ); - - state.totalInputSize += state.benchmarkInputSize; - state.totalParseTime += state.benchmarkParseTime; - }; - } + function benchmarkFinalizer(i) { + return function() { + callbacks.benchmarkFinish( + benchmarks[i], + state.benchmarkInputSize, + state.benchmarkParseTime + ); - function finalize() { - callbacks.finish(state.totalInputSize, state.totalParseTime); - } + state.totalInputSize += state.benchmarkInputSize; + state.totalParseTime += state.benchmarkParseTime; + }; + } - /* Main */ + function finalize() { + callbacks.finish(state.totalInputSize, state.totalParseTime); + } + + /* Main */ - Q.add(initialize); - for (i = 0; i < benchmarks.length; i++) { - Q.add(benchmarkInitializer(i)); - for (j = 0; j < benchmarks[i].tests.length; j++) { - Q.add(testRunner(i, j)); + Q.add(initialize); + for (i = 0; i < benchmarks.length; i++) { + Q.add(benchmarkInitializer(i)); + for (j = 0; j < benchmarks[i].tests.length; j++) { + Q.add(testRunner(i, j)); + } + Q.add(benchmarkFinalizer(i)); } - Q.add(benchmarkFinalizer(i)); + Q.add(finalize); + + Q.run(); } - Q.add(finalize); + }; - Q.run(); - } -}; +}));