throughput/
throughput.rs

1use ringbuffer_spsc::ringbuffer;
2use std::{
3    sync::atomic::{AtomicUsize, Ordering},
4    time::{Duration, Instant},
5};
6
7fn main() {
8    static COUNTER: AtomicUsize = AtomicUsize::new(0);
9    let (mut tx, mut rx) = ringbuffer::<usize>(2_usize.pow(10));
10
11    std::thread::spawn(move || loop {
12        if tx.push(1).is_some() {
13            std::thread::yield_now();
14        }
15    });
16
17    std::thread::spawn(move || loop {
18        if rx.pull().is_some() {
19            COUNTER.fetch_add(1, Ordering::Relaxed);
20        } else {
21            std::thread::yield_now();
22        }
23    });
24
25    static STEP: Duration = Duration::from_secs(1);
26    let start = Instant::now();
27    for i in 1..=u32::MAX {
28        std::thread::sleep(start + i * STEP - Instant::now());
29        println!("{} elem/s", COUNTER.swap(0, Ordering::Relaxed));
30    }
31}