diff --git a/README.md b/README.md index 62dab12..899682f 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,60 @@ packages operations. - [x] pinojs - [x] winston - [x] underscore + +## Running + +To a pretty terminal output, run `index.js` + +```console +$ node index.js +Running Node.js Package Benchmark... +---------------------------------------------------------- +babel + transform (code=true ast=true): 70.09 (3 samples) + transform (code=false): 78.57 (2 samples) +dotenv + config: 31.09K (5 samples) +lodash + .chunk: 24.47M (5 samples) + .groupBy: 3.343M (7 samples) + .includes: 10.35M (6 samples) + .orderBy: 921.3K (8 samples) +moment + format (full): 504.7K (7 samples) + format: 441K (4 samples) + fromNow (YYYYMMDD): 73K (9 samples) + subtract (10): 134K (5 samples) +pinojs + info (10x): 109.1K (4 samples) +prettier + format (semi=true): 773.5K (3 samples) + format (singleQuote=true semi=true tabs=true): 593.7K (3 samples) + format (singleQuote=false semi=false tabs=false): 473.4K (3 samples) +underscore + .chunk: 3.15M (3 samples) + .groupBy: 1.003M (3 samples) + .includes: 6.588M (4 samples) + .orderBy: 488.7K (5 samples) +winston + info (10x): 24.48K (4 samples) +``` + +To store it as JSON, just pipe output to a file: + +```console +$ node index.js > results.json +$ cat result.json +[ + { + "name": "babel", + "method": "benchmarkjs", + "operations": [ + { + "name": "transform (code=true ast=true)", + "opsSec": 67.80076532539411, + "samples": 3 + }, + { +... +``` diff --git a/console-output.js b/console-output.js new file mode 100644 index 0000000..7649964 --- /dev/null +++ b/console-output.js @@ -0,0 +1,22 @@ +const opsSecFormatter = Intl.NumberFormat('en-US', { notation: 'compact', maximumSignificantDigits: 4}) + +module.exports = { + log (str) { + console.log(str); + }, + printResults (results) { + const halfScreen = process.stdout.columns / 2; + console.log('-'.repeat(halfScreen)); + for (const result of results) { + console.log(`${result.name}`); + // TODO(rafaelgss): support non-operation method + for (const operation of result.operations) { + const opName = ` ${operation.name}:`; + const spaces = ' '.repeat(halfScreen - opName.length); + console.log(opName + + `${spaces}${opsSecFormatter.format(operation.opsSec)} (${operation.samples} samples)`); + } + } + console.log('-'.repeat(process.stdout.columns / 2)); + } +} diff --git a/index.js b/index.js index 65b7d6f..5ce3637 100644 --- a/index.js +++ b/index.js @@ -12,15 +12,32 @@ const piscina = new Piscina({ maxQueue: 1, }); +let output; +// Considering this script won't be called as a +// child_process, stdout.isTTY should be reliable enough. +if (process.env.TTY || process.stdout.isTTY) { + output = require('./console-output'); +} else { + output = { + log: () => {}, + printResults: (results) => { + console.log(JSON.stringify(results, null, 2)); + } + } +} + async function main() { const files = await fs.readdir(path.join(__dirname, './src')); + output.log('Running Node.js Package Benchmark...'); + const results = []; for (const file of files) { if (file.match(/.*-benchmark\.js$/)) { const benchFile = path.join(__dirname, './src/', file); const result = await piscina.run(benchFile); - console.log('results', JSON.stringify(result, null, 2)); + results.push(result); } } + output.printResults(results); } main();