use std::hint::black_box;
use std::io::{Cursor, Write};
use subms::{SubMsBenchSummary, SubMsPerfHarness, SubMsTimer, summarize, summary_to_json};
fn main() {
let mut h = SubMsPerfHarness::new("subms-self-bench", "rust");
h.input("samples_per_stage", "50000");
h.add_meta("rust_version", env!("CARGO_PKG_RUST_VERSION"));
h.add_meta("crate_version", env!("CARGO_PKG_VERSION"));
{
let s = h.stage("time_closure", 50_000);
for _ in 0..50_000 {
s.time(|| black_box(()));
}
}
{
let s = h.stage("record_ns", 50_000);
for i in 0..50_000u64 {
s.record(black_box(100 + (i & 63)));
}
}
{
let summary_target = build_sample_harness(50_000);
let s = h.stage("summarize", 100);
for _ in 0..100 {
s.time(|| {
let summary = summarize(black_box(&summary_target));
black_box(summary);
});
}
}
{
let summary = summarize(&build_sample_harness(50_000));
let s = h.stage("summary_to_json", 100);
for _ in 0..100 {
s.time(|| {
let mut buf = Cursor::new(Vec::with_capacity(64 * 1024));
summary_to_json(black_box(&summary), &mut buf).unwrap();
let _ = buf.flush();
black_box(buf);
});
}
}
{
let base: SubMsBenchSummary = summarize(&build_sample_harness(50_000));
let cand: SubMsBenchSummary = summarize(&build_sample_harness(50_000));
let s = h.stage("diff_summary", 1_000);
for _ in 0..1_000 {
s.time(|| {
let d = subms::diff_summary(black_box(&base), black_box(&cand));
black_box(d);
});
}
}
let mut t = SubMsTimer::new("self-bench-wall");
t.mark("stages-complete");
t.stop("emitting-json");
h.add_meta("self_bench_wall_ns", &t.elapsed_ns().to_string());
let summary = summarize(&h);
summary_to_json(&summary, &mut std::io::stdout()).unwrap();
}
fn build_sample_harness(n: usize) -> SubMsPerfHarness {
let mut h = SubMsPerfHarness::new("fixture", "rust");
let s = h.stage("fixture-stage", n);
for i in 0..n as u64 {
let v = if i % 1000 == 0 {
10_000 + (i & 1023)
} else {
100 + (i & 63)
};
s.record(v);
}
h
}