quickring 0.1.0

A very fast, lock-free SPSC ring buffer.
Documentation
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 << 1 }>();
    // bench_ringbuffer::<{ 1 << 2 }>();
    // bench_ringbuffer::<{ 1 << 3 }>();
    // bench_ringbuffer::<{ 1 << 4 }>();
    // bench_ringbuffer::<{ 1 << 5 }>();
    // bench_ringbuffer::<{ 1 << 6 }>();
    // bench_ringbuffer::<{ 1 << 7 }>();
    // bench_ringbuffer::<{ 1 << 8 }>();
    // bench_ringbuffer::<{ 1 << 9 }>();
    // bench_ringbuffer::<{ 1 << 10 }>();
    // bench_ringbuffer::<{ 1 << 11 }>();
    bench_ringbuffer::<{ 1 << 12 }>();
    bench_ringbuffer::<{ 1 << 13 }>();
    // bench_ringbuffer::<{ 1 << 14 }>();
    // bench_ringbuffer::<{ 1 << 15 }>();
    // bench_ringbuffer::<{ 1 << 16 }>();
    // bench_ringbuffer::<{ 1 << 17 }>();
    // bench_ringbuffer::<{ 1 << 18 }>();
    // bench_ringbuffer::<{ 1 << 19 }>();
    // bench_ringbuffer::<{ 1 << 20 }>();
    // bench_ringbuffer::<{ 1 << 21 }>();
    // bench_ringbuffer::<{ 1 << 22 }>();
    // bench_ringbuffer::<{ 1 << 23 }>();
    // bench_ringbuffer::<{ 1 << 24 }>();
    // bench_ringbuffer::<{ 1 << 25 }>();

    // bench_ringbuf::<{ 1 << 1 }>();
    // bench_ringbuf::<{ 1 << 2 }>();
    // bench_ringbuf::<{ 1 << 3 }>();
    // bench_ringbuf::<{ 1 << 4 }>();
    // bench_ringbuf::<{ 1 << 5 }>();
    // bench_ringbuf::<{ 1 << 6 }>();
    // bench_ringbuf::<{ 1 << 7 }>();
    // bench_ringbuf::<{ 1 << 8 }>();
    // bench_ringbuf::<{ 1 << 9 }>();
    // bench_ringbuf::<{ 1 << 10 }>();
    // bench_ringbuf::<{ 1 << 11 }>();
    // bench_ringbuf::<{ 1 << 12 }>();
    // bench_ringbuf::<{ 1 << 13 }>();
    // bench_ringbuf::<{ 1 << 14 }>();
    // bench_ringbuf::<{ 1 << 15 }>();
    // bench_ringbuf::<{ 1 << 16 }>();
    // bench_ringbuf::<{ 1 << 17 }>();
    // bench_ringbuf::<{ 1 << 18 }>();
    // bench_ringbuf::<{ 1 << 19 }>();
    // bench_ringbuf::<{ 1 << 20 }>();
    // bench_ringbuf::<{ 1 << 21 }>();
    // bench_ringbuf::<{ 1 << 22 }>();
    // bench_ringbuf::<{ 1 << 23 }>();
    // bench_ringbuf::<{ 1 << 24 }>();
    // bench_ringbuf::<{ 1 << 25 }>();
}

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);
}