UNPKG

@thi.ng/bench

Version:

Benchmarking & profiling utilities w/ various statistics & formatters (CSV, JSON, Markdown etc.)

57 lines (56 loc) 1.43 kB
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 };