diff --git a/Makefile b/Makefile index 9b0ba57b222ad5..9f8cd3e94cadc0 100644 --- a/Makefile +++ b/Makefile @@ -329,7 +329,7 @@ pkgsrc: $(PKGSRC) haswrk=$(shell which wrk > /dev/null 2>&1; echo $$?) wrk: ifneq ($(haswrk), 0) - @echo "please install wrk before proceeding"; >&2 + @echo "please install wrk before proceeding. More information can be found in benchmark/README.md." >&2 @exit 1 endif diff --git a/benchmark/README.md b/benchmark/README.md index 0568f35029a18d..dc6f53fbe71929 100644 --- a/benchmark/README.md +++ b/benchmark/README.md @@ -3,9 +3,13 @@ This folder contains benchmark tests to measure the performance for certain io.js APIs. -## prerequisites +## Prerequisites -Most of the http benchmarks require `wrk` and `ab` being installed. +Most of the http benchmarks require [`wrk`][wrk] and [`ab`][ab] being installed. +These are most often available through your preferred package manager. + +[wrk]: https://github.com/wg/wrk +[ab]: http://httpd.apache.org/docs/2.2/programs/ab.html ## How to run tests diff --git a/benchmark/common.js b/benchmark/common.js index 2e3cedced3c51d..0b0c7ee8705905 100644 --- a/benchmark/common.js +++ b/benchmark/common.js @@ -1,7 +1,7 @@ var assert = require('assert'); var fs = require('fs'); var path = require('path'); -var spawn = require('child_process').spawn; +var child_process = require('child_process'); var silent = +process.env.NODE_BENCH_SILENT; @@ -9,6 +9,7 @@ exports.PORT = process.env.PORT || 12346; // If this is the main module, then run the benchmarks if (module === require.main) { + hasWrk(); var type = process.argv[2]; var testFilter = process.argv[3]; if (!type) { @@ -36,6 +37,15 @@ if (module === require.main) { runBenchmarks(); } +function hasWrk() { + var result = child_process.spawnSync('wrk', ['-h']); + if (result.error.code === 'ENOENT') { + console.error('Couldn\'t locate `wrk` which is needed for running ' + + 'benchmarks. Check benchmark/README.md for further instructions.'); + process.exit(-1); + } +} + function runBenchmarks() { var test = tests.shift(); if (!test) @@ -48,7 +58,7 @@ function runBenchmarks() { test = path.resolve(dir, test); var a = (process.execArgv || []).concat(test); - var child = spawn(process.execPath, a, { stdio: 'inherit' }); + var child = child_process.spawn(process.execPath, a, { stdio: 'inherit' }); child.on('close', function(code) { if (code) { process.exit(code); @@ -70,7 +80,10 @@ function Benchmark(fn, options) { this._name = require.main.filename.split(/benchmark[\/\\]/).pop(); this._start = [0,0]; this._started = false; + var self = this; + + hasWrk(); process.nextTick(function() { self._run(); }); @@ -85,7 +98,7 @@ Benchmark.prototype.http = function(p, args, cb) { args = args.concat(url); var out = ''; - var child = spawn('wrk', args); + var child = child_process.spawn('wrk', args); child.stdout.setEncoding('utf8'); @@ -145,7 +158,7 @@ Benchmark.prototype._run = function() { if (!argv) return; argv = process.execArgv.concat(argv); - var child = spawn(node, argv, { stdio: 'inherit' }); + var child = child_process.spawn(node, argv, { stdio: 'inherit' }); child.on('close', function(code, signal) { if (code) console.error('child process exited with code ' + code);