use gil::mpmc::channel;
use std::{hint::black_box, num::NonZeroUsize, thread::spawn, time::SystemTime};
fn main() {
let (tx, rx) = channel(NonZeroUsize::new(4096).unwrap());
const SENDERS: usize = 4;
const MESSAGES: usize = 5_000_000;
let start = SystemTime::now();
for _ in 0..SENDERS {
let mut tx = tx.clone();
spawn(move || {
for i in 0..MESSAGES {
while tx.try_send(black_box(i)).is_err() {}
}
});
}
drop(tx);
let mut handles = Vec::with_capacity(SENDERS);
for _ in 0..SENDERS {
let mut rx = rx.clone();
handles.push(spawn(move || {
for _ in 0..MESSAGES {
loop {
let Some(x) = rx.try_recv() else {
continue;
};
black_box(x);
break;
}
}
}));
}
drop(rx);
for handle in handles {
handle.join().unwrap();
}
let time = start.elapsed().unwrap();
println!(
"time={time:?}\nmil/s={throughput:.2}",
throughput = MESSAGES as f64 / 1_000_000.0 / time.as_secs_f64()
);
}