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, BATCH, KEY_LENGTH};
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion, Throughput};
use fst_incremental::IncrementalFstSet;
use std::hint::black_box;

fn bench_remove_single(c: &mut Criterion) {
  let mut group = c.benchmark_group("RemoveSingle");
  let mut r = rng(0);

  for size in [1_000usize, 10_000, 100_000] {
    let base_keys = keys(&mut r, size, KEY_LENGTH);
    let base = persisted_bytes(&base_keys);
    let victims: Vec<Vec<u8>> = base_keys.iter().take(BATCH).cloned().collect();

    group.throughput(Throughput::Elements(victims.len() as u64));

    group.bench_with_input(BenchmarkId::new("FromPersisted", size), &size, |b, _| {
      b.iter_batched(
        || common::from_bytes(&base),
        |set| {
          for key in &victims {
            black_box(set.remove(key).unwrap());
          }
        },
        criterion::BatchSize::SmallInput,
      );
    });

    group.bench_with_input(BenchmarkId::new("FromAddBuffer", size), &size, |b, _| {
      b.iter_batched(
        || {
          let set = IncrementalFstSet::new(Some(common::no_rebuild())).unwrap();
          set.bulk_insert(victims.clone()).unwrap();
          set
        },
        |set| {
          for key in &victims {
            black_box(set.remove(key).unwrap());
          }
        },
        criterion::BatchSize::SmallInput,
      );
    });
  }
  group.finish();
}

criterion_group!(benches, bench_remove_single);
criterion_main!(benches);