swactor/benches/worker_benchmarks.rs

122 lines
3.8 KiB
Rust
Raw Normal View History

2026-02-07 11:59:04 +00:00
use std::collections::VecDeque;
use criterion::{
criterion_group, criterion_main, BenchmarkId, Criterion, Throughput,
};
2026-02-07 11:59:04 +00:00
use swactor::worker::drain_count;
// ---------------------------------------------------------------------------
// drain_count O(1) verification
// ---------------------------------------------------------------------------
fn bench_drain_count(c: &mut Criterion) {
let mut group = c.benchmark_group("drain_count");
// Below waterlevel
group.bench_function("below", |b| {
b.iter(|| std::hint::black_box(drain_count(50, 100)));
});
// At waterlevel
group.bench_function("at", |b| {
b.iter(|| std::hint::black_box(drain_count(100, 100)));
});
// Above waterlevel
group.bench_function("above", |b| {
b.iter(|| std::hint::black_box(drain_count(500, 100)));
});
group.finish();
}
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
// VecDeque push throughput (mirrors old mailbox_push)
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
fn vecdeque_push(c: &mut Criterion) {
let mut group = c.benchmark_group("vecdeque_push");
for n in [100, 1_000, 10_000] {
group.throughput(Throughput::Elements(n as u64));
group.bench_with_input(BenchmarkId::from_parameter(n), &n, |b, &n| {
b.iter(|| {
2026-02-07 11:59:04 +00:00
let mut q: VecDeque<u64> = VecDeque::new();
for i in 0..n {
2026-02-07 11:59:04 +00:00
q.push_back(i as u64);
}
});
});
}
group.finish();
}
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
// VecDeque pop throughput (mirrors old mailbox_pop)
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
fn vecdeque_pop(c: &mut Criterion) {
let mut group = c.benchmark_group("vecdeque_pop");
for n in [100, 1_000, 10_000] {
group.throughput(Throughput::Elements(n as u64));
group.bench_with_input(BenchmarkId::from_parameter(n), &n, |b, &n| {
b.iter_batched(
|| {
2026-02-07 11:59:04 +00:00
let mut q: VecDeque<u64> = VecDeque::new();
for i in 0..n {
2026-02-07 11:59:04 +00:00
q.push_back(i as u64);
}
2026-02-07 11:59:04 +00:00
q
},
2026-02-07 11:59:04 +00:00
|mut q| {
for _ in 0..n {
2026-02-07 11:59:04 +00:00
std::hint::black_box(q.pop_front());
}
},
criterion::BatchSize::SmallInput,
);
});
}
group.finish();
}
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
// Simulated actor tick: drain_count + pop N from VecDeque
// ---------------------------------------------------------------------------
2026-02-07 11:59:04 +00:00
fn simulated_actor_tick(c: &mut Criterion) {
let mut group = c.benchmark_group("simulated_actor_tick");
for (wl, fill) in [(10, 5), (10, 10), (10, 50), (100, 200)] {
let param = format!("wl={wl},fill={fill}");
group.bench_function(BenchmarkId::from_parameter(&param), |b| {
b.iter_batched(
|| {
2026-02-07 11:59:04 +00:00
let mut q: VecDeque<u64> = VecDeque::new();
for i in 0..fill {
2026-02-07 11:59:04 +00:00
q.push_back(i as u64);
}
2026-02-07 11:59:04 +00:00
q
},
2026-02-07 11:59:04 +00:00
|mut q| {
let n = drain_count(q.len(), wl);
for _ in 0..n {
2026-02-07 11:59:04 +00:00
std::hint::black_box(q.pop_front());
}
},
criterion::BatchSize::SmallInput,
);
});
}
group.finish();
}
criterion_group!(
benches,
2026-02-07 11:59:04 +00:00
bench_drain_count,
vecdeque_push,
vecdeque_pop,
simulated_actor_tick,
);
criterion_main!(benches);