vecmap 0.1.0

Vec-based Map and Set data structures.
Documentation
extern crate rand;
extern crate vecmap;

use criterion::{
    black_box, criterion_group, criterion_main, Bencher, BenchmarkId, Criterion, Throughput,
};
use rand::prelude::*;
use std::collections::HashMap;
use vecmap::VecMap;

fn bench_fill_vecmap(b: &mut Bencher, &size: &i32) {
    let numbers: Vec<i32> = rand::distributions::Uniform::new(0, size)
        .sample_iter(thread_rng())
        .take(size as usize)
        .collect();
    b.iter(|| {
        let mut map: VecMap<i32, i32> = VecMap::new();
        for i in 0..size {
            map.insert(numbers[i as usize], i);
        }
        black_box(map.get(&0));
    });
}

fn bench_fill_hashmap(b: &mut Bencher, &size: &i32) {
    let numbers: Vec<i32> = rand::distributions::Uniform::new(0, size)
        .sample_iter(thread_rng())
        .take(size as usize)
        .collect();
    b.iter(|| {
        let mut map: HashMap<i32, i32> = HashMap::new();
        for i in 0..size {
            map.insert(numbers[i as usize], i);
        }
        black_box(map.get(&0));
    });
}

fn bench_fill(c: &mut Criterion) {
    let mut group = c.benchmark_group("Fill");
    for size in [1, 10, 100, 1000, 10000].iter() {
        group.throughput(Throughput::Elements(*size as u64));
        group.bench_with_input(BenchmarkId::new("VecMap", size), size, bench_fill_vecmap);
        group.bench_with_input(BenchmarkId::new("HashMap", size), size, bench_fill_hashmap);
    }
    group.finish();
}

fn bench_entry_vecmap(b: &mut Bencher, &size: &i32) {
    let mut map: VecMap<i32, i32> = VecMap::new();
    let mut rng = thread_rng();
    let distr = rand::distributions::Uniform::new(0, size);
    for i in 0..size {
        map.insert(distr.sample(&mut rng), i);
    }
    b.iter(|| {
        black_box(map.entry(distr.sample(&mut rng)));
    });
}

fn bench_entry_hashmap(b: &mut Bencher, &size: &i32) {
    let mut map: HashMap<i32, i32> = HashMap::new();
    let mut rng = thread_rng();
    let distr = rand::distributions::Uniform::new(0, size);
    for i in 0..size {
        map.insert(distr.sample(&mut rng), i);
    }
    b.iter(|| {
        black_box(map.entry(distr.sample(&mut rng)));
    });
}

fn bench_entry(c: &mut Criterion) {
    let mut group = c.benchmark_group("Entry");
    for size in [1, 10, 100, 1000, 10000].iter() {
        group.bench_with_input(BenchmarkId::new("VecMap", size), size, bench_entry_vecmap);
        group.bench_with_input(BenchmarkId::new("HashMap", size), size, bench_entry_hashmap);
    }
    group.finish();
}

fn bench_counting_vecmap(b: &mut Bencher, &size: &i32) {
    let mut map: VecMap<i32, i32> = VecMap::new();
    let mut rng = thread_rng();
    let distr = rand::distributions::Uniform::new(0, size);
    b.iter(|| {
        *map.entry(distr.sample(&mut rng)).or_insert(0) += 1;
    });
    black_box(map);
}

fn bench_counting_hashmap(b: &mut Bencher, &size: &i32) {
    let mut map: HashMap<i32, i32> = HashMap::new();
    let mut rng = thread_rng();
    let distr = rand::distributions::Uniform::new(0, size);
    b.iter(|| {
        *map.entry(distr.sample(&mut rng)).or_insert(0) += 1;
    });
    black_box(map);
}

fn bench_counting(c: &mut Criterion) {
    let mut group = c.benchmark_group("Counting");
    for size in [1, 10, 100, 1000, 10000].iter() {
        group.bench_with_input(
            BenchmarkId::new("VecMap", size),
            size,
            bench_counting_vecmap,
        );
        group.bench_with_input(
            BenchmarkId::new("HashMap", size),
            size,
            bench_counting_hashmap,
        );
    }
    group.finish();
}

criterion_group!(benches, bench_fill, bench_entry, bench_counting);
criterion_main!(benches);