use criterion::{criterion_group, criterion_main, BatchSize, Criterion};
use rand::{rngs::SmallRng, Rng, SeedableRng};
use timer_queue::TimerQueue;
fn bench(c: &mut Criterion) {
let mut rng = SmallRng::from_seed([0xAB; 32]);
{
let mut group = c.benchmark_group("insert");
for timers in [10, 1_000, 1_000_000] {
for period in [10, 1_000, 1_000_000] {
group.throughput(criterion::Throughput::Elements(timers));
group.bench_function(format!("{} timers over {} ticks", timers, period), |b| {
b.iter_batched(
|| TimerQueue::with_capacity(timers as usize),
|mut q| {
for _ in 0..timers {
q.insert(rng.gen_range(0..period), ());
}
},
BatchSize::SmallInput,
)
});
}
}
}
{
let mut group = c.benchmark_group("poll");
for timers in [0, 10, 1_000, 1_000_000] {
for period in [10, 1_000, 1_000_000] {
group.throughput(criterion::Throughput::Elements(timers));
group.bench_function(format!("{} timers over {} ticks", timers, period), |b| {
b.iter_batched(
|| {
let mut q = TimerQueue::with_capacity(timers as usize);
for _ in 0..timers {
q.insert(rng.gen_range(0..period), ());
}
q
},
|mut q| {
while let Some(_) = q.poll(period) {}
},
BatchSize::SmallInput,
)
});
}
}
}
}
criterion_group!(benches, bench);
criterion_main!(benches);