logvec 1.1.1

A cache-friendly Bentley-Saxe logarithmic array data structure.
Documentation
#[path = "support/common.rs"]
mod common;

use common::{LargeStruct, N, shuffled_keys};
use criterion::{BatchSize, Criterion, criterion_group, criterion_main};
use logvec::LogVec;
use std::{collections::BTreeSet, hint::black_box};

fn bench_insert_u64(c: &mut Criterion) {
    let mut group = c.benchmark_group("baseline/insert_u64_10k");
    let random = shuffled_keys(N);

    group.bench_function("logvec", |b| {
        b.iter_batched(
            || random.clone(),
            |input| {
                let mut arr = LogVec::new();
                for key in input {
                    arr.insert(black_box(key));
                }
                arr
            },
            BatchSize::SmallInput,
        )
    });

    group.bench_function("btree_set", |b| {
        b.iter_batched(
            || random.clone(),
            |input| {
                let mut set = BTreeSet::new();
                for key in input {
                    set.insert(black_box(key));
                }
                set
            },
            BatchSize::SmallInput,
        )
    });

    group.bench_function("naive_sorted_vec", |b| {
        b.iter_batched(
            || random.clone(),
            |input| {
                let mut vec = Vec::new();
                for key in input {
                    let val = black_box(key);
                    let pos = vec.binary_search(&val).unwrap_or_else(|e| e);
                    vec.insert(pos, val);
                }
                vec
            },
            BatchSize::SmallInput,
        )
    });
}

fn bench_search_u64(c: &mut Criterion) {
    let mut group = c.benchmark_group("baseline/search_u64_10k");
    let keys = shuffled_keys(N);
    let mut log_arr = LogVec::new();
    let mut btree = BTreeSet::new();
    for key in &keys {
        log_arr.insert(*key);
        btree.insert(*key);
    }

    group.bench_function("logvec", |b| {
        b.iter(|| {
            for i in 0..N as u64 {
                black_box(log_arr.contains(black_box(&i)));
            }
        })
    });

    group.bench_function("btree_set", |b| {
        b.iter(|| {
            for i in 0..N as u64 {
                black_box(btree.contains(black_box(&i)));
            }
        })
    });
}

fn bench_insert_large_struct(c: &mut Criterion) {
    let mut group = c.benchmark_group("baseline/insert_large_struct_10k");
    let random = shuffled_keys(N);

    group.bench_function("logvec", |b| {
        b.iter_batched(
            || random.clone(),
            |input| {
                let mut arr = LogVec::new();
                for key in input {
                    arr.insert(black_box(LargeStruct::new(key)));
                }
                arr
            },
            BatchSize::SmallInput,
        )
    });

    group.bench_function("btree_set", |b| {
        b.iter_batched(
            || random.clone(),
            |input| {
                let mut set = BTreeSet::new();
                for key in input {
                    set.insert(black_box(LargeStruct::new(key)));
                }
                set
            },
            BatchSize::SmallInput,
        )
    });
}

criterion_group!(
    baseline_benches,
    bench_insert_u64,
    bench_search_u64,
    bench_insert_large_struct
);
criterion_main!(baseline_benches);