fparkan/vendor/weezl/benches/msb8.rs
Valentin Popov 1b6a04ca55
Initial vendor packages
Signed-off-by: Valentin Popov <valentin@popov.link>
2024-01-08 01:21:28 +04:00

55 lines
1.7 KiB
Rust

extern crate criterion;
extern crate weezl;
use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use std::fs;
use weezl::{decode::Decoder, BitOrder, LzwStatus};
pub fn criterion_benchmark(c: &mut Criterion, file: &str) {
let data = fs::read(file).expect("Benchmark input not found");
let mut group = c.benchmark_group("msb-8");
let id = BenchmarkId::new(file, data.len());
let mut outbuf = vec![0; 1 << 26]; // 64MB, what wuff uses..
let mut decode_once = |data: &[u8]| {
let mut decoder = Decoder::new(BitOrder::Msb, 8);
let mut written = 0;
let outbuf = outbuf.as_mut_slice();
let mut data = data;
loop {
let result = decoder.decode_bytes(data, &mut outbuf[..]);
let done = result.status.expect("Error");
data = &data[result.consumed_in..];
written += result.consumed_out;
black_box(&outbuf[..result.consumed_out]);
if let LzwStatus::Done = done {
break;
}
if let LzwStatus::NoProgress = done {
panic!("Need to make progress");
}
}
written
};
group.throughput(Throughput::Bytes(decode_once(&data) as u64));
group.bench_with_input(id, &data, |b, data| {
b.iter(|| {
decode_once(data);
})
});
}
pub fn bench_toml(c: &mut Criterion) {
criterion_benchmark(c, "benches/Cargo-8-msb.lzw");
}
pub fn bench_binary(c: &mut Criterion) {
criterion_benchmark(c, "benches/binary-8-msb.lzw");
}
pub fn bench_lib(c: &mut Criterion) {
criterion_benchmark(c, "benches/lib-8-msb.lzw");
}
criterion_group!(benches, bench_toml, bench_binary, bench_lib);
criterion_main!(benches);