queue-file 2.0.0

queue-file is a lightning-fast, transactional, file-based FIFO
Documentation
use auto_delete_path::AutoDeletePath;
use criterion::{Bencher, BenchmarkId, Criterion, Throughput, criterion_group, criterion_main};
use queue_file::QueueFile;

const BATCH_SIZE: usize = 1000;
const SIZES: &[usize] = &[64, 1024, 10240];

fn bench_write_macro(c: &mut Criterion) {
    let mut group = c.benchmark_group("write_macro");
    for &size in SIZES {
        let data = vec![0u8; size];
        group.throughput(Throughput::Elements(BATCH_SIZE as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(size),
            &size,
            |b: &mut Bencher, &_size| {
                b.iter_batched(
                    || {
                        let path = AutoDeletePath::temp();
                        let qf = QueueFile::open(path.as_ref()).unwrap();
                        (path, qf)
                    },
                    |(_path, mut qf): (AutoDeletePath, QueueFile)| {
                        for _ in 0..BATCH_SIZE {
                            qf.add(&data).unwrap();
                        }
                    },
                    criterion::BatchSize::SmallInput,
                );
            },
        );
    }
    group.finish();
}

fn bench_read_iter_macro(c: &mut Criterion) {
    let mut group = c.benchmark_group("read_iter_macro");
    for &size in SIZES {
        let data = vec![0u8; size];
        group.throughput(Throughput::Elements(BATCH_SIZE as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(size),
            &size,
            |b: &mut Bencher, &_size| {
                b.iter_batched(
                    || {
                        let path = AutoDeletePath::temp();
                        let mut qf = QueueFile::open(path.as_ref()).unwrap();
                        for _ in 0..BATCH_SIZE {
                            qf.add(&data).unwrap();
                        }
                        (path, qf)
                    },
                    |(_path, qf): (AutoDeletePath, QueueFile)| {
                        for item in qf.iter() {
                            criterion::black_box(item);
                        }
                    },
                    criterion::BatchSize::SmallInput,
                );
            },
        );
    }
    group.finish();
}

fn bench_read_remove_macro(c: &mut Criterion) {
    let mut group = c.benchmark_group("read_remove_macro");
    for &size in SIZES {
        let data = vec![0u8; size];
        group.throughput(Throughput::Elements(BATCH_SIZE as u64));
        group.bench_with_input(
            BenchmarkId::from_parameter(size),
            &size,
            |b: &mut Bencher, &_size| {
                b.iter_batched(
                    || {
                        let path = AutoDeletePath::temp();
                        let mut qf = QueueFile::open(path.as_ref()).unwrap();
                        for _ in 0..BATCH_SIZE {
                            qf.add(&data).unwrap();
                        }
                        (path, qf)
                    },
                    |(_path, mut qf): (AutoDeletePath, QueueFile)| {
                        for _ in 0..BATCH_SIZE {
                            qf.remove().unwrap();
                        }
                    },
                    criterion::BatchSize::SmallInput,
                );
            },
        );
    }
    group.finish();
}

criterion_group!(benches, bench_write_macro, bench_read_iter_macro, bench_read_remove_macro);
criterion_main!(benches);