Skip to content

Commit

Permalink
benchmark: refactor to use process.send
Browse files Browse the repository at this point in the history
This removes the need for parsing stdout from the benchmarks. If the
process wasn't executed by fork, it will just print like it used to.

This also fixes the parsing of CLI arguments, by inferring the type
from the options object instead of the value content.

Only two benchmarks had to be changed:

* http/http_server_for_chunky_client.js this previously used a spawn
now it uses a fork and relays the messages using common.sendResult.

* misc/v8-bench.js this utilized that v8/benchmark/run.js called
global.print and reformatted the input. It now interfaces directly
with the benchmark runner global.BenchmarkSuite.

PR-URL: #7094
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
Reviewed-By: Brian White <mscdex@mscdex.net>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
  • Loading branch information
AndreasMadsen committed Jul 26, 2016
1 parent 0f9bfaa commit f99471b
Show file tree
Hide file tree
Showing 5 changed files with 358 additions and 232 deletions.
99 changes: 99 additions & 0 deletions benchmark/_cli.js
@@ -0,0 +1,99 @@
'use strict';

const fs = require('fs');
const path = require('path');

// Create an object of all benchmark scripts
const benchmarks = {};
fs.readdirSync(__dirname)
.filter(function(name) {
return fs.statSync(path.resolve(__dirname, name)).isDirectory();
})
.forEach(function(category) {
benchmarks[category] = fs.readdirSync(path.resolve(__dirname, category))
.filter((filename) => filename[0] !== '.' && filename[0] !== '_');
});

function CLI(usage, settings) {
if (!(this instanceof CLI)) return new CLI(usage, settings);

if (process.argv.length < 3) {
this.abort(usage); // abort will exit the process
}

this.usage = usage;
this.optional = {};
this.items = [];

for (const argName of settings.arrayArgs) {
this.optional[argName] = [];
}

let currentOptional = null;
let mode = 'both'; // possible states are: [both, option, item]

for (const arg of process.argv.slice(2)) {
if (arg === '--') {
// Only items can follow --
mode = 'item';
} else if (['both', 'option'].includes(mode) && arg[0] === '-') {
// Optional arguments declaration

if (arg[1] === '-') {
currentOptional = arg.slice(2);
} else {
currentOptional = arg.slice(1);
}

// Default the value to true
if (!settings.arrayArgs.includes(currentOptional)) {
this.optional[currentOptional] = true;
}

// expect the next value to be option related (either -- or the value)
mode = 'option';
} else if (mode === 'option') {
// Optional arguments value

if (settings.arrayArgs.includes(currentOptional)) {
this.optional[currentOptional].push(arg);
} else {
this.optional[currentOptional] = arg;
}

// the next value can be either an option or an item
mode = 'both';
} else if (['both', 'item'].includes(mode)) {
// item arguments
this.items.push(arg);

// the next value must be an item
mode = 'item';
} else {
// Bad case, abort
this.abort(usage);
return;
}
}
}
module.exports = CLI;

CLI.prototype.abort = function(msg) {
console.error(msg);
process.exit(1);
};

CLI.prototype.benchmarks = function() {
const paths = [];
const filter = this.optional.filter || false;

for (const category of this.items) {
for (const scripts of benchmarks[category]) {
if (filter && scripts.lastIndexOf(filter) === -1) continue;

paths.push(path.join(category, scripts));
}
}

return paths;
};

0 comments on commit f99471b

Please sign in to comment.