use quickring::RingBuffer;
use ringbuf::traits::{Consumer, Producer};
use ringbuf::{StaticRb, traits::Split};
use std::thread;
use std::time::Instant;
const OPS: usize = 1_000_000_000;
fn main() {
bench_ringbuffer::<{ 1 << 12 }>();
bench_ringbuffer::<{ 1 << 13 }>();
}
fn bench_ringbuffer<const CAP: usize>() {
let rb: RingBuffer<usize, CAP> = RingBuffer::new();
let (mut tx, mut rx) = rb.split();
let start = Instant::now();
let mut sum = 0_usize;
let producer = thread::spawn(move || {
for i in 0..OPS {
while !tx.push(i) {}
}
});
let consumer = thread::spawn(move || {
let mut sum = 0usize;
for _ in 0..OPS {
loop {
if let Some(x) = rx.pop() {
sum = sum.wrapping_add(x);
break;
}
}
}
sum
});
producer.join().unwrap();
let sum = consumer.join().unwrap();
let duration = start.elapsed();
println!("Sum: {}", sum);
println!("RingBuffer CAP = {}: {:?}", CAP, duration);
}
fn bench_ringbuf<const CAP: usize>() {
let rb = StaticRb::<usize, CAP>::default();
let (mut tx, mut rx) = rb.split();
let start = Instant::now();
let producer = thread::spawn(move || {
for i in 0..OPS {
while tx.try_push(i).is_err() {}
}
});
let consumer = thread::spawn(move || {
for _ in 0..OPS {
while rx.try_pop().is_none() {}
}
});
producer.join().unwrap();
consumer.join().unwrap();
let duration = start.elapsed();
println!("StaticRb CAP = {}: {:?}", CAP, duration);
}