use std::time::Instant;
use psltools::{Reader, write_psl};
fn main() {
let mut args = std::env::args().skip(1);
let Some(path) = args.next() else {
eprintln!("usage: benchmark <file.psl> [iterations]");
std::process::exit(2);
};
let iterations: u32 = args.next().and_then(|s| s.parse().ok()).unwrap_or(3);
let bytes = std::fs::read(&path).expect("read input");
let mb = bytes.len() as f64 / 1_000_000.0;
eprintln!("input: {path} ({mb:.2} MB)");
for i in 0..iterations {
let start = Instant::now();
let reader = Reader::<psltools::Psl>::from_owned_bytes(bytes.clone()).expect("parse");
let elapsed = start.elapsed();
eprintln!(
"[seq iter {i}] {} records in {elapsed:?} ({:.1} MB/s)",
reader.len(),
mb / elapsed.as_secs_f64()
);
}
#[cfg(feature = "parallel")]
for i in 0..iterations {
let start = Instant::now();
let reader =
Reader::<psltools::Psl>::from_owned_bytes_parallel(bytes.clone()).expect("parse");
let elapsed = start.elapsed();
eprintln!(
"[par iter {i}] {} records in {elapsed:?} ({:.1} MB/s)",
reader.len(),
mb / elapsed.as_secs_f64()
);
}
let reader = Reader::<psltools::Psl>::from_owned_bytes(bytes).expect("parse");
let mut out = Vec::with_capacity(reader.len() * 64);
let start = Instant::now();
for psl in reader.records() {
write_psl(&mut out, psl).expect("write");
}
let elapsed = start.elapsed();
eprintln!(
"[write] {} records, {} bytes in {elapsed:?} ({:.1} MB/s)",
reader.len(),
out.len(),
out.len() as f64 / 1_000_000.0 / elapsed.as_secs_f64()
);
}