mod common;
use common::{keys, persisted_bytes, rng, KEY_LENGTH};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
use fst_incremental::IncrementalFstSet;
use std::hint::black_box;
const PROBES: usize = 100;
fn bench_load(c: &mut Criterion) {
let mut group = c.benchmark_group("Load");
let mut r = rng(0);
let dir = tempfile::tempdir().unwrap();
for size in [10_000usize, 100_000, 1_000_000] {
let all = keys(&mut r, size, KEY_LENGTH);
let bytes = persisted_bytes(&all);
let path = dir.path().join(format!("{size}.fst"));
std::fs::write(&path, &bytes).unwrap();
let probes: Vec<Vec<u8>> = all.iter().take(PROBES).cloned().collect();
group.bench_with_input(BenchmarkId::new("Heap/Open", size), &size, |b, _| {
b.iter(|| {
let data = std::fs::read(&path).unwrap();
black_box(IncrementalFstSet::from_data(Some(data), Some(common::no_rebuild())).unwrap())
});
});
group.bench_with_input(BenchmarkId::new("Mmap/Open", size), &size, |b, _| {
b.iter(|| black_box(IncrementalFstSet::from_persisted_mmap(&path, Some(common::no_rebuild())).unwrap()));
});
group.bench_with_input(BenchmarkId::new("Heap/OpenAndProbe", size), &size, |b, _| {
b.iter(|| {
let data = std::fs::read(&path).unwrap();
let set = IncrementalFstSet::from_data(Some(data), Some(common::no_rebuild())).unwrap();
for key in &probes {
black_box(set.contains(key).unwrap());
}
});
});
group.bench_with_input(BenchmarkId::new("Mmap/OpenAndProbe", size), &size, |b, _| {
b.iter(|| {
let set = IncrementalFstSet::from_persisted_mmap(&path, Some(common::no_rebuild())).unwrap();
for key in &probes {
black_box(set.contains(key).unwrap());
}
});
});
}
group.finish();
}
criterion_group!(benches, bench_load);
criterion_main!(benches);