@thi.ng/bench
Version:
Benchmarking & profiling utilities w/ various statistics & formatters (CSV, JSON, Markdown etc.)
57 lines (56 loc) • 1.43 kB
JavaScript
import { benchResult } from "./bench.js";
import { FORMAT_DEFAULT } from "./format/default.js";
const DEFAULT_OPTS = {
title: "benchmark",
iter: 1e3,
size: 1,
extSize: 1,
warmup: 10,
output: true,
format: FORMAT_DEFAULT
};
const benchmark = (fn, opts) => {
const _opts = { ...DEFAULT_OPTS, ...opts };
let { iter, size, extSize, warmup, output, format } = _opts;
output && outputString(format.start(_opts));
const t = benchResult(fn, warmup * size)[1];
output && outputString(format.warmup(t, _opts));
const samples = [];
for (let i = iter; i-- > 0; ) {
samples.push(benchResult(fn, size)[1]);
}
samples.sort((a, b) => a - b);
const total = samples.reduce((acc, x) => acc + x, 0);
const freq = iter * size * extSize * 1e3 / total;
const mean = total / iter;
const median = samples[iter >> 1];
const min = samples[0];
const max = samples[iter - 1];
const q1 = samples[Math.floor(iter * 0.25)];
const q3 = samples[Math.floor(iter * 0.75)];
const sd = Math.sqrt(
samples.reduce((acc, x) => acc + (mean - x) ** 2, 0) / iter
) / mean * 100;
const res = {
title: _opts.title,
iter,
size,
total,
freq,
mean,
median,
min,
max,
q1,
q3,
sd
};
output && outputString(format.result(res));
return res;
};
const outputString = (str) => str !== "" && console.log(str);
export {
DEFAULT_OPTS,
benchmark,
outputString
};