#![feature(test)] macro_rules! DEFINE_NxM_BENCH { ($i:ident, $n:literal, $m:literal) => { mod $i { use super::*; #[bench] fn bench_insert_baseline_hashmap(bencher: &mut Bencher) { do_bench_insert_baseline_hashmap(bencher, $n, $m); } #[bench] fn bench_insert_bucket_map(bencher: &mut Bencher) { do_bench_insert_bucket_map(bencher, $n, $m); } } }; } extern crate test; use rayon::prelude::*; use gemachain_bucket_map::bucket_map::{BucketMap, BucketMapConfig}; use gemachain_sdk::pubkey::Pubkey; use std::collections::hash_map::HashMap; use std::sync::RwLock; use test::Bencher; type IndexValue = u64; DEFINE_NxM_BENCH!(dim_01x02, 1, 2); DEFINE_NxM_BENCH!(dim_02x04, 2, 4); DEFINE_NxM_BENCH!(dim_04x08, 4, 8); DEFINE_NxM_BENCH!(dim_08x16, 8, 16); DEFINE_NxM_BENCH!(dim_16x32, 16, 32); DEFINE_NxM_BENCH!(dim_32x64, 32, 64); /// Benchmark insert with Hashmap as baseline for N threads inserting M keys each fn do_bench_insert_baseline_hashmap(bencher: &mut Bencher, n: usize, m: usize) { let index = RwLock::new(HashMap::new()); (0..n).into_iter().into_par_iter().for_each(|i| { let key = Pubkey::new_unique(); index .write() .unwrap() .insert(key, vec![(i, IndexValue::default())]); }); bencher.iter(|| { (0..n).into_iter().into_par_iter().for_each(|_| { for j in 0..m { let key = Pubkey::new_unique(); index .write() .unwrap() .insert(key, vec![(j, IndexValue::default())]); } }) }); } /// Benchmark insert with BucketMap with N buckets for N threads inserting M keys each fn do_bench_insert_bucket_map(bencher: &mut Bencher, n: usize, m: usize) { let index = BucketMap::new(BucketMapConfig::new(n)); (0..n).into_iter().into_par_iter().for_each(|i| { let key = Pubkey::new_unique(); index.update(&key, |_| Some((vec![(i, IndexValue::default())], 0))); }); bencher.iter(|| { (0..n).into_iter().into_par_iter().for_each(|_| { for j in 0..m { let key = Pubkey::new_unique(); index.update(&key, |_| Some((vec![(j, IndexValue::default())], 0))); } }) }); }