use std::time::{Duration, Instant};
use criterion::{Criterion, Throughput, black_box, criterion_group, criterion_main};
use rayon::prelude::*;
use slow5lib::Slow5Reader;
const FIVE_READS_ZSTD: &str = "tests/data/five_reads.blow5";
const SMALL_BLOW5: &str = "tests/data/small.blow5";
fn bench_parallel_five_reads(c: &mut Criterion) {
let mut group = c.benchmark_group("parallel_five_reads");
group.bench_function("sequential", |b| {
b.iter(|| {
let mut reader = Slow5Reader::open(black_box(FIVE_READS_ZSTD)).expect("open");
let mut total = 0usize;
for rec in reader.records() {
total += rec.expect("record ok").raw_signal.len();
}
black_box(total)
});
});
group.bench_function("par_bridge", |b| {
b.iter(|| {
let mut reader = Slow5Reader::open(black_box(FIVE_READS_ZSTD)).expect("open");
let total: usize = reader
.records_raw()
.par_bridge()
.map(|r| {
r.expect("raw record ok")
.decompress()
.expect("decompress")
.raw_signal
.len()
})
.sum();
black_box(total)
});
});
group.bench_function("par_records", |b| {
b.iter(|| {
let mut reader = Slow5Reader::open(black_box(FIVE_READS_ZSTD)).expect("open");
let total: usize = reader
.par_records()
.map(|r| r.expect("record ok").raw_signal.len())
.sum();
black_box(total)
});
});
group.finish();
}
fn bench_parallel_large(c: &mut Criterion) {
let file_bytes = std::fs::metadata(SMALL_BLOW5).map(|m| m.len()).unwrap_or(0);
let mut group = c.benchmark_group("parallel_large");
group.sample_size(10);
group.measurement_time(Duration::from_secs(120));
group.throughput(Throughput::Bytes(file_bytes));
group.bench_function("sequential", |b| {
b.iter_custom(|iters| {
let mut total = Duration::ZERO;
for _ in 0..iters {
let mut reader = Slow5Reader::open(SMALL_BLOW5).expect("open");
let t0 = Instant::now();
let mut samples = 0usize;
for rec in reader.records() {
samples += rec.expect("record ok").raw_signal.len();
}
total += t0.elapsed();
black_box(samples);
}
total
});
});
group.bench_function("par_records", |b| {
b.iter_custom(|iters| {
let mut total = Duration::ZERO;
for _ in 0..iters {
let mut reader = Slow5Reader::open(SMALL_BLOW5).expect("open");
let t0 = Instant::now();
let samples: usize = reader
.par_records()
.map(|r| r.expect("record ok").raw_signal.len())
.sum();
total += t0.elapsed();
black_box(samples);
}
total
});
});
group.finish();
}
criterion_group!(benches, bench_parallel_five_reads, bench_parallel_large);
criterion_main!(benches);