Simple benchmarking tool that spits its results out in csv format.
$ npm install -g bench-csv
Step 1: Write your benchmark
# file: benchmark.js
// function being benchmarked
const randomDelay = ms => new Promise(resolve => setTimeout(resolve, Math.round(Math.random() * ms)))
// export it
module.exports = () => randomDelay(100)
Step 2: run bench-csv on it
bench-csv ./path/to/benchmark.js
outputs (changes every time it's run)
"pid","timestamp","memory","duration"
"8342","2017-08-30T14:24:13.416Z","66229821","38"
Benchmark slow-code.js
continously, running batches of 10 iterations with 5 warmups and waiting 60 seconds between runs:
bench-csv --watch --delay=60 --warmups=5 --repeat=10 slow-code.js -o slow-code.csv
Under the hood this uses nodemon to restart when the code being benchmarked changes.
The -o
param tells bench-csv to send its results to the file targetted, creating it if missing.
--watch
Runs the benchmark continously, accounting for changes in the target
--delay [seconds]
When watching, how long to wait before each benchmark is performed. Defaults to 1 second
--repeat [1]
How many iterations to perform each benchmark
--header [true]
Whether to display the header row
--delim [',']
Delimiter to use between columns of the CSV output. For tabs use `--delim="\t"` works too
--warmups[=0]
Runs this many iterations before recording begins. Default to 0.
--inspect
Enables remote debugging. What use would benchmarking be without profiling.
Should you need it, bench-csv supports specifying lifecycle hooks as below:
// slow-code-with-lifecycle.js
// Runs before each batch of iterations
module.exports.beforeAll = () => { ... }
// Runs before each iteration
module.exports.before = () => { ... }
// The function being benchmarked
module.exports.run = () => { ... }
// Runs after each iteration
module.exports.after = () => { ... }
// Runs after each batch of iterations
module.exports.afterAll = () => { ... }
Then you can benchmark it as before:
bench-csv --watch --repeat=10 --delay=60 ./path/to/slow-code-with-lifecycle.js
ISC © Allain Lalonde