use std::num::NonZeroUsize;
use criterion::{Criterion, criterion_group, criterion_main};
use futures::executor::block_on;
use zruntime::broadcast::channel;
fn broadcast_and_recv(c: &mut Criterion) {
let mut group = c.benchmark_group("broadcast");
let (s, r1) = channel(NonZeroUsize::MIN);
let mut receivers = vec![r1];
let mut n = 0u64;
for count in [1, 2, 4, 8] {
while receivers.len() < count {
let r = receivers[0].new_receiver();
receivers.push(r);
}
group.bench_function(format!("1-to-{count}"), |b| {
b.iter(|| {
block_on(async {
s.broadcast(n).await.unwrap();
for r in receivers.iter_mut() {
assert_eq!(r.recv().await.unwrap(), n);
}
n += 1;
})
})
});
}
group.finish();
}
criterion_group!(benches, broadcast_and_recv);
criterion_main!(benches);