use criterion::{BenchmarkId, Criterion, criterion_group, criterion_main};
use lencode::io::VecWriter;
use lencode::prelude::*;
use rand::rngs::StdRng;
use rand::{RngExt, SeedableRng};
use std::hint::black_box;
fn bench_heuristic_overhead(c: &mut Criterion) {
let mut group = c.benchmark_group("heuristic");
let mut rng = StdRng::seed_from_u64(0xE0E0E0E0);
for &len in &[32usize, 63, 64, 65, 128, 256, 512, 1024] {
let data: Vec<u8> = (0..len).map(|_| rng.random()).collect();
group.bench_with_input(BenchmarkId::new("random_encode", len), &data, |b, data| {
b.iter(|| {
let mut writer = VecWriter::with_capacity(len + 16);
data.encode_ext(&mut writer, None).unwrap();
black_box(writer);
})
});
}
for &len in &[64usize, 128, 256, 512, 1024] {
let data: Vec<u8> = vec![0u8; len];
group.bench_with_input(BenchmarkId::new("zeros_encode", len), &data, |b, data| {
b.iter(|| {
let mut writer = VecWriter::with_capacity(len + 16);
data.encode_ext(&mut writer, None).unwrap();
black_box(writer);
})
});
}
for &len in &[32usize, 64, 128, 256, 512, 1024] {
let data: Vec<u8> = (0..len).map(|_| rng.random()).collect();
let encoded = {
let mut w = VecWriter::with_capacity(len + 16);
data.encode_ext(&mut w, None).unwrap();
w.into_inner()
};
group.bench_with_input(
BenchmarkId::new("random_decode", len),
&encoded,
|b, encoded| {
b.iter(|| {
let mut cursor = lencode::io::Cursor::new(black_box(encoded.as_slice()));
let v: Vec<u8> = Decode::decode_ext(&mut cursor, None).unwrap();
black_box(v);
})
},
);
}
group.finish();
}
criterion_group!(benches, bench_heuristic_overhead);
criterion_main!(benches);