#![allow(missing_docs, unused_doc_comments, unused_attributes)]
use criterion::{Criterion, black_box, criterion_group, criterion_main};
use mrrc::MarcReader;
use rayon::prelude::*;
use std::io::Cursor;
fn load_fixture(filename: &str) -> Vec<u8> {
let path = format!("tests/data/fixtures/{filename}");
std::fs::read(&path).unwrap_or_else(|_| panic!("Failed to load fixture: {path}"))
}
fn benchmark_sequential_2x_1k(c: &mut Criterion) {
let fixture = black_box(load_fixture("1k_records.mrc"));
c.bench_function("sequential_2x_1k_records", |b| {
b.iter(|| {
let mut total_count = 0;
for _ in 0..2 {
let cursor = Cursor::new(fixture.clone());
let mut reader = MarcReader::new(cursor);
while let Ok(Some(_record)) = reader.read_record() {
total_count += 1;
}
}
total_count
});
});
}
fn benchmark_parallel_2x_1k(c: &mut Criterion) {
let fixture = black_box(load_fixture("1k_records.mrc"));
c.bench_function("parallel_2x_1k_records", |b| {
b.iter(|| {
let files = vec![fixture.clone(), fixture.clone()];
files
.par_iter()
.map(|data| {
let cursor = Cursor::new(data.clone());
let mut reader = MarcReader::new(cursor);
let mut count = 0;
while let Ok(Some(_record)) = reader.read_record() {
count += 1;
}
count
})
.sum::<usize>()
});
});
}
fn benchmark_sequential_4x_1k(c: &mut Criterion) {
let fixture = black_box(load_fixture("1k_records.mrc"));
c.bench_function("sequential_4x_1k_records", |b| {
b.iter(|| {
let mut total_count = 0;
for _ in 0..4 {
let cursor = Cursor::new(fixture.clone());
let mut reader = MarcReader::new(cursor);
while let Ok(Some(_record)) = reader.read_record() {
total_count += 1;
}
}
total_count
});
});
}
fn benchmark_parallel_4x_1k(c: &mut Criterion) {
let fixture = black_box(load_fixture("1k_records.mrc"));
c.bench_function("parallel_4x_1k_records", |b| {
b.iter(|| {
let files = vec![
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
];
files
.par_iter()
.map(|data| {
let cursor = Cursor::new(data.clone());
let mut reader = MarcReader::new(cursor);
let mut count = 0;
while let Ok(Some(_record)) = reader.read_record() {
count += 1;
}
count
})
.sum::<usize>()
});
});
}
fn benchmark_parallel_8x_1k(c: &mut Criterion) {
let fixture = black_box(load_fixture("1k_records.mrc"));
c.bench_function("parallel_8x_1k_records", |b| {
b.iter(|| {
let files = vec![
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
];
files
.par_iter()
.map(|data| {
let cursor = Cursor::new(data.clone());
let mut reader = MarcReader::new(cursor);
let mut count = 0;
while let Ok(Some(_record)) = reader.read_record() {
count += 1;
}
count
})
.sum::<usize>()
});
});
}
fn benchmark_sequential_2x_10k(c: &mut Criterion) {
let fixture = black_box(load_fixture("10k_records.mrc"));
c.bench_function("sequential_2x_10k_records", |b| {
b.iter(|| {
let mut total_count = 0;
for _ in 0..2 {
let cursor = Cursor::new(fixture.clone());
let mut reader = MarcReader::new(cursor);
while let Ok(Some(_record)) = reader.read_record() {
total_count += 1;
}
}
total_count
});
});
}
fn benchmark_parallel_2x_10k(c: &mut Criterion) {
let fixture = black_box(load_fixture("10k_records.mrc"));
c.bench_function("parallel_2x_10k_records", |b| {
b.iter(|| {
let files = vec![fixture.clone(), fixture.clone()];
files
.par_iter()
.map(|data| {
let cursor = Cursor::new(data.clone());
let mut reader = MarcReader::new(cursor);
let mut count = 0;
while let Ok(Some(_record)) = reader.read_record() {
count += 1;
}
count
})
.sum::<usize>()
});
});
}
fn benchmark_parallel_4x_10k(c: &mut Criterion) {
let fixture = black_box(load_fixture("10k_records.mrc"));
c.bench_function("parallel_4x_10k_records", |b| {
b.iter(|| {
let files = vec![
fixture.clone(),
fixture.clone(),
fixture.clone(),
fixture.clone(),
];
files
.par_iter()
.map(|data| {
let cursor = Cursor::new(data.clone());
let mut reader = MarcReader::new(cursor);
let mut count = 0;
while let Ok(Some(_record)) = reader.read_record() {
count += 1;
}
count
})
.sum::<usize>()
});
});
}
criterion_group!(
parallel_benches,
benchmark_sequential_2x_1k,
benchmark_parallel_2x_1k,
benchmark_sequential_4x_1k,
benchmark_parallel_4x_1k,
benchmark_parallel_8x_1k,
benchmark_sequential_2x_10k,
benchmark_parallel_2x_10k,
benchmark_parallel_4x_10k,
);
criterion_main!(parallel_benches);