55 lines
1.7 KiB
Rust
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);
|