fst_incremental 1.0.2

A thread-safe, updatable finite state set: dynamic insertions, deletions and queries over an immutable fst::Set fronted by a compact mutation buffer with amortized rebuilds.
Documentation
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);