buffered_offset_reader 0.6.0

Buffered file read_at (pread)
Documentation
use std::fs::File;
use std::io::Write;
use tempfile::tempfile;

use criterion::{criterion_group, criterion_main, Criterion};

use buffered_offset_reader::*;

fn make_temp_file(chunk_size: u8, chunk_count: u64) -> (File, Vec<u8>) {
    let mut file = tempfile().unwrap();
    let chunk = (0..chunk_size).into_iter().collect::<Vec<u8>>();

    for _ in 0..chunk_count {
        file.write(&chunk).unwrap();
    }
    (file, chunk)
}

const CHUNK_SIZE: u8 = 64;
const CHUNK_COUNT: u64 = 1024;

fn read_file(c: &mut Criterion) {
    let (file, chunk) = make_temp_file(CHUNK_SIZE, CHUNK_COUNT);

    c.bench_function("file_read_at", move |b| {
        let mut tmp = vec![0; CHUNK_SIZE as usize];
        b.iter(|| {
            for i in 0..CHUNK_COUNT {
                file.read_at(&mut tmp, i * CHUNK_SIZE as u64).unwrap();
                assert_eq!(&tmp, &chunk);
            }
        });
    });
}

fn read_buffered(c: &mut Criterion) {
    let (file, chunk) = make_temp_file(CHUNK_SIZE, CHUNK_COUNT);

    c.bench_function("buffered_read_at", move |b| {
        let mut r = BufOffsetReader::with_capacity(CHUNK_SIZE as usize * 16, file.try_clone().unwrap());

        let mut tmp = vec![0; CHUNK_SIZE as usize];
        b.iter(|| {
            for i in 0..CHUNK_COUNT {
                r.read_at(&mut tmp, i * CHUNK_SIZE as u64).unwrap();
                assert_eq!(&tmp, &chunk);
            }
        });
    });
}

criterion_group!(benches, read_file, read_buffered);
criterion_main!(benches);