densemap 0.1.3

A collection data structure that is permanently accessible by unique keys and fast iterable.
Documentation
use criterion::{black_box, criterion_group, criterion_main, Criterion};

fn insertion(c: &mut Criterion) {
    let mut g = c.benchmark_group("insertion");
    g.bench_function("vec", |b| {
        b.iter(|| {
            let mut vec = vec![];
            for _ in 0..10000 {
                vec.push(black_box(0));
            }
        });
    });
    g.bench_function("hashmap", |b| {
        b.iter(|| {
            let mut hashmap = std::collections::HashMap::new();
            for i in 0..10000 {
                hashmap.insert(i, black_box(0));
            }
        });
    });
    g.bench_function("slab", |b| {
        b.iter(|| {
            let mut slab = slab::Slab::new();
            for _ in 0..10000 {
                let key = slab.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("slotmap", |b| {
        b.iter(|| {
            let mut slotmap = slotmap::SlotMap::new();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("hop slotmap", |b| {
        b.iter(|| {
            let mut slotmap = slotmap::HopSlotMap::new();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("dense slotmap", |b| {
        b.iter(|| {
            let mut slotmap = slotmap::DenseSlotMap::new();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("densemap", |b| {
        b.iter(|| {
            let mut densemap = densemap::DenseMap::new();
            for _ in 0..10000 {
                let key = densemap.insert(black_box(0));
                black_box(key);
            }
        });
    });
}

fn remove(c: &mut Criterion) {
    let mut g = c.benchmark_group("remove");
    g.bench_function("vec", |b| {
        let mut vec = vec![];
        for _ in 0..10000 {
            vec.push(0);
        }
        b.iter(|| {
            let mut vec = vec.clone();
            for _ in 0..10000 {
                let value = vec.pop();
                black_box(value);
            }
        });
    });
    g.bench_function("hashmap", |b| {
        let mut hashmap = std::collections::HashMap::new();
        for i in 0..10000 {
            hashmap.insert(i, 0);
        }
        b.iter(|| {
            let mut hashmap = hashmap.clone();
            for i in 0..10000 {
                let value = hashmap.remove(&i);
                black_box(value);
            }
        });
    });
    g.bench_function("slab", |b| {
        let mut slab = slab::Slab::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slab.insert(0);
            keys.push(key);
        }
        b.iter(|| {
            let mut slab = slab.clone();
            for key in keys.iter() {
                let value = slab.remove(*key);
                black_box(value);
            }
        });
    });
    g.bench_function("slotmap", |b| {
        let mut slotmap = slotmap::SlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for key in keys.iter() {
                let value = slotmap.remove(*key);
                black_box(value);
            }
        });
    });
    g.bench_function("hop slotmap", |b| {
        let mut slotmap = slotmap::HopSlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for key in keys.iter() {
                let value = slotmap.remove(*key);
                black_box(value);
            }
        });
    });
    g.bench_function("dense slotmap", |b| {
        let mut slotmap = slotmap::DenseSlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for key in keys.iter() {
                let value = slotmap.remove(*key);
                black_box(value);
            }
        });
    });
    g.bench_function("densemap", |b| {
        let mut densemap = densemap::DenseMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = densemap.insert(0);
            keys.push(key);
        }
        b.iter(|| {
            let mut densemap = densemap.clone();
            for key in keys.iter() {
                let value = densemap.remove(*key);
                black_box(value);
            }
        });
    });
}

fn reinsertion(c: &mut Criterion) {
    let mut g = c.benchmark_group("reinsertion");
    g.bench_function("vec", |b| {
        let mut vec = vec![];
        for _ in 0..10000 {
            vec.push(0);
        }
        for _ in 0..10000 {
            vec.pop();
        }
        b.iter(|| {
            let mut vec = vec.clone();
            for _ in 0..10000 {
                vec.push(black_box(0));
            }
        });
    });
    g.bench_function("hashmap", |b| {
        let mut hashmap = std::collections::HashMap::new();
        for i in 0..10000 {
            hashmap.insert(i, 0);
        }
        for i in 0..10000 {
            hashmap.remove(&i);
        }
        b.iter(|| {
            let mut hashmap = hashmap.clone();
            for i in 0..10000 {
                hashmap.insert(i, black_box(0));
            }
        });
    });
    g.bench_function("slab", |b| {
        let mut slab = slab::Slab::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slab.insert(0);
            keys.push(key);
        }
        for key in keys.iter() {
            slab.remove(*key);
        }
        b.iter(|| {
            let mut slab = slab.clone();
            for _ in 0..10000 {
                let key = slab.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("slotmap", |b| {
        let mut slotmap = slotmap::SlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        for key in keys.iter() {
            slotmap.remove(*key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("hop slotmap", |b| {
        let mut slotmap = slotmap::HopSlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        for key in keys.iter() {
            slotmap.remove(*key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("dense slotmap", |b| {
        let mut slotmap = slotmap::DenseSlotMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = slotmap.insert(0);
            keys.push(key);
        }
        for key in keys.iter() {
            slotmap.remove(*key);
        }
        b.iter(|| {
            let mut slotmap = slotmap.clone();
            for _ in 0..10000 {
                let key = slotmap.insert(black_box(0));
                black_box(key);
            }
        });
    });
    g.bench_function("densemap", |b| {
        let mut densemap = densemap::DenseMap::new();
        let mut keys = vec![];
        for _ in 0..10000 {
            let key = densemap.insert(0);
            keys.push(key);
        }
        for key in keys.iter() {
            densemap.remove(*key);
        }
        b.iter(|| {
            let mut densemap = densemap.clone();
            for _ in 0..10000 {
                let key = densemap.insert(black_box(0));
                black_box(key);
            }
        });
    });
}

fn iteration(c: &mut Criterion) {
    let mut g = c.benchmark_group("iteration");
    g.bench_function("vec", |b| {
        let mut vec = vec![];
        for _ in 0..10000 {
            vec.push(0);
        }
        b.iter(|| {
            for value in vec.iter() {
                black_box(value);
            }
        });
    });
    g.bench_function("hashmap", |b| {
        let mut hashmap = std::collections::HashMap::new();
        for i in 0..10000 {
            hashmap.insert(i, 0);
        }
        b.iter(|| {
            for value in hashmap.values() {
                black_box(value);
            }
        });
    });
    g.bench_function("slab", |b| {
        let mut slab = slab::Slab::new();
        for _ in 0..10000 {
            slab.insert(0);
        }
        b.iter(|| {
            for (_, value) in slab.iter() {
                black_box(value);
            }
        });
    });
    g.bench_function("slotmap", |b| {
        let mut slotmap = slotmap::SlotMap::new();
        for _ in 0..10000 {
            slotmap.insert(0);
        }
        b.iter(|| {
            for value in slotmap.values() {
                black_box(value);
            }
        });
    });
    g.bench_function("hop slotmap", |b| {
        let mut slotmap = slotmap::HopSlotMap::new();
        for _ in 0..10000 {
            slotmap.insert(0);
        }
        b.iter(|| {
            for value in slotmap.values() {
                black_box(value);
            }
        });
    });
    g.bench_function("dense slotmap", |b| {
        let mut slotmap = slotmap::DenseSlotMap::new();
        for _ in 0..10000 {
            slotmap.insert(0);
        }
        b.iter(|| {
            for value in slotmap.values() {
                black_box(value);
            }
        });
    });
    g.bench_function("densemap", |b| {
        let mut densemap = densemap::DenseMap::new();
        for _ in 0..10000 {
            densemap.insert(0);
        }
        b.iter(|| {
            for value in densemap.values() {
                black_box(value);
            }
        });
    });
}

criterion_group!(benches, insertion, remove, reinsertion, iteration);
criterion_main!(benches);