mod common;
use common::N;
use common::data::gen_gamma_data;
use criterion::{Criterion, Throughput, criterion_group, criterion_main};
use dsi_bitstream::prelude::*;
use std::hint::black_box;
#[cfg(feature = "bench-u16")]
type ReadWord = u16;
#[cfg(all(feature = "bench-u64", not(feature = "bench-u16")))]
type ReadWord = u64;
#[cfg(not(any(feature = "bench-u16", feature = "bench-u64")))]
type ReadWord = u32;
macro_rules! bench_endian {
($group:expr, $E:ty, $ename:literal, $gamma_data:expr) => {{
let data: &[u64] = $gamma_data;
let encoded = {
let mut buffer: Box<[u64]> = vec![0u64; 10 * N].into_boxed_slice();
{
let mut wr =
BufBitWriter::<$E, _>::new(MemWordWriterSlice::<u64, _>::new(&mut *buffer));
for &value in data {
wr.write_gamma(value).unwrap();
}
}
buffer
};
let slice: &[ReadWord] = unsafe { encoded.align_to::<ReadWord>().1 };
let expected = data.iter().fold(0u64, |acc, &v| acc.wrapping_add(v));
let mut reader = BufBitReader::<$E, _>::new(MemWordReader::new(slice));
let mut sum = 0u64;
for _ in 0..data.len() {
sum = sum.wrapping_add(reader.read_gamma().unwrap());
}
assert_eq!(sum, expected, "read_gamma/{} checksum mismatch", $ename);
$group.bench_function(concat!("read_gamma/", $ename), |b| {
b.iter(|| {
let mut r = BufBitReader::<$E, _>::new(MemWordReader::new(slice));
for _ in 0..N {
black_box(r.read_gamma().unwrap());
}
});
});
}};
}
fn bench_bufbitreader_gamma(c: &mut Criterion) {
#[cfg(target_os = "linux")]
common::utils::pin_to_core(2);
let mut group = c.benchmark_group("bufbitreader_gamma");
group.throughput(Throughput::Elements(u64::try_from(N).unwrap()));
let (_, gamma_data) = gen_gamma_data(false);
bench_endian!(group, BE, "BE", &gamma_data);
bench_endian!(group, LE, "LE", &gamma_data);
group.finish();
}
criterion_group! {
name = bufbitreader_gamma;
config = Criterion::default()
.sample_size(10)
.warm_up_time(std::time::Duration::from_millis(500))
.measurement_time(std::time::Duration::from_secs(2));
targets = bench_bufbitreader_gamma
}
criterion_main!(bufbitreader_gamma);