use std::env;
use std::time::Instant;
use entropy_map::Mphf;
use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
use rand::random;
pub fn benchmark(c: &mut Criterion) {
let n: usize = env::var("N").unwrap_or("1000000".to_string()).parse().unwrap();
let query_n: usize = env::var("QN").unwrap_or("1000000".to_string()).parse().unwrap();
let mut group = c.benchmark_group("mphf");
group.throughput(Throughput::Elements(query_n as u64));
let t0 = Instant::now();
let items: Vec<u64> = (0..n).map(|_| random()).collect();
println!("items generation took: {:?}", t0.elapsed());
for &gamma in &[1.0_f32, 2.0_f32] {
let t0 = Instant::now();
let mphf = Mphf::<32, 8>::from_slice(&items, gamma).expect("failed to build mphf");
let bits = (mphf.size() as f32) * 8.0 / (n as f32);
println!(
"mphf ({:.1}) construction took: {:?}, bits per key: {:.2}",
gamma,
t0.elapsed(),
bits
);
group.bench_function(format!("mphf-get/gamma-{:.1}", gamma), |b| {
b.iter(|| {
for item in items.iter().take(query_n) {
mphf.get(black_box(item)).unwrap();
}
});
});
let t0 = Instant::now();
let rkyv_bytes = rkyv::to_bytes::<_, 1024>(&mphf).unwrap();
println!("mphf ({:.1}) rkyv serialization took: {:?}", gamma, t0.elapsed());
let rkyv_mphf = rkyv::check_archived_root::<Mphf<32, 8>>(&rkyv_bytes).unwrap();
group.bench_function(format!("rkyv-mphf-get/gamma-{:.1}", gamma), |b| {
b.iter(|| {
for item in items.iter().take(query_n) {
rkyv_mphf.get(black_box(item)).unwrap();
}
});
});
}
group.finish();
}
criterion_group! {
name = benches;
config = Criterion::default();
targets = benchmark,
}
criterion_main!(benches);