A tiny MoonBit benchmark statistics toolkit for stopwatch-style measurements.
moon add sa2360/moonbench{
"import": [
{
"path": "sa2360/moonbench",
"alias": "bench"
}
]
}let set = @bench.sample_set_from([1_000_000, 1_200_000, 1_100_000])
println(@bench.sample_set_json(set))let summary = @bench.benchmark(5, () => {
let mut total = 0
for i in 0..<20_000_000 {
total = total + i % 17
}
ignore(total)
})
println(@bench.describe(summary))
println("spread=\{@bench.format_ns(@bench.spread_ns(summary))}")
println("stable(5%)=\{@bench.is_stable(summary, 50_000)}")count=5, mean=13 ms, min=11 ms, max=23 ms, throughput=72/s
spread=12 ms
stable(5%)=falselet set = @bench.sample_set_from([100, 140, 160, 200])
let dist = @bench.distribution(set)
println(@bench.summary_csv_header())
println(@bench.summary_csv(set.summary))
println(@bench.sample_set_json(set))
println("p95=\{@bench.format_ns(dist.p95_ns)}")let imported = @bench.sample_set_from([0, 12_000_000, 12_400_000, 80_000_000])
let cleaned = @bench.filter_samples(
imported,
@bench.SampleFilter::{ min_ns: 1, max_ns: 50_000_000, drop_zero: true },
)
let baseline = @bench.sample_set_from([12_200_000, 12_200_000, 12_300_000])
println(@bench.sample_set_markdown(cleaned))
println(@bench.regression_report(cleaned.summary, baseline.summary, 80_000))let mut tick = 0
let fake_clock = @bench.Clock::{
name: "deterministic",
now_ns: () => {
tick = tick + 10
tick
},
}
let set = @bench.benchmark_with_clock(3, fake_clock, () => ignore(1 + 1))
println(@bench.sample_set_json(set))moon check
moon build
moon fmt
moon info
moon test
moon run cmd/mainpub(all) struct Clock {
name : String
now_ns : () -> Int
}pub(all) struct Distribution {
p50_ns : Int
p90_ns : Int
p95_ns : Int
p99_ns : Int
variance_ns2 : Double
std_dev_ns : Double
} derive(Debug)fn format_ns(ns : Int) -> Stringfn measure(run : () -> Unit) -> IntA tiny MoonBit benchmark statistics toolkit for stopwatch-style measurements.