hashbrown 0.4.0

A Rust port of Google's SwissTable hash map
Documentation
#![feature(test)]

extern crate test;

use std::hash::Hash;
use test::{black_box, Bencher};

use hashbrown::HashMap;
//use rustc_hash::FxHashMap as HashMap;
//use std::collections::HashMap;

fn new_map<K: Eq + Hash, V>() -> HashMap<K, V> {
    HashMap::default()
}

#[bench]
fn insert_i32(b: &mut Bencher) {
    b.iter(|| {
        let mut m: HashMap<i32, i32> = new_map();
        for i in 1..1001 {
            m.insert(i, i);
        }
        black_box(m);
    })
}

#[bench]
fn insert_i64(b: &mut Bencher) {
    b.iter(|| {
        let mut m: HashMap<i64, i64> = new_map();
        for i in 1..1001 {
            m.insert(i, i);
        }
        black_box(m);
    })
}

#[bench]
fn insert_erase_i32(b: &mut Bencher) {
    b.iter(|| {
        let mut m: HashMap<i32, i32> = new_map();
        for i in 1..1001 {
            m.insert(i, i);
        }
        black_box(&mut m);
        for i in 1..1001 {
            m.remove(&i);
        }
        black_box(m);
    })
}

#[bench]
fn insert_erase_i64(b: &mut Bencher) {
    b.iter(|| {
        let mut m: HashMap<i64, i64> = new_map();
        for i in 1..1001 {
            m.insert(i, i);
        }
        black_box(&mut m);
        for i in 1..1001 {
            m.remove(&i);
        }
        black_box(m);
    })
}

#[bench]
fn lookup_i32(b: &mut Bencher) {
    let mut m: HashMap<i32, i32> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in 1..1001 {
            black_box(m.get(&i));
        }
    })
}

#[bench]
fn lookup_i64(b: &mut Bencher) {
    let mut m: HashMap<i64, i64> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in 1..1001 {
            black_box(m.get(&i));
        }
    })
}

#[bench]
fn lookup_fail_i32(b: &mut Bencher) {
    let mut m: HashMap<i32, i32> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in 1001..2001 {
            black_box(m.get(&i));
        }
    })
}

#[bench]
fn lookup_fail_i64(b: &mut Bencher) {
    let mut m: HashMap<i64, i64> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in 1001..2001 {
            black_box(m.get(&i));
        }
    })
}

#[bench]
fn iter_i32(b: &mut Bencher) {
    let mut m: HashMap<i32, i32> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in &m {
            black_box(i);
        }
    })
}

#[bench]
fn iter_i64(b: &mut Bencher) {
    let mut m: HashMap<i64, i64> = new_map();
    for i in 1..1001 {
        m.insert(i, i);
    }

    b.iter(|| {
        for i in &m {
            black_box(i);
        }
    })
}