78 lines
2.3 KiB
Rust
78 lines
2.3 KiB
Rust
#![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::*,
|
|
solana_bucket_map::bucket_map::{BucketMap, BucketMapConfig},
|
|
solana_sdk::pubkey::Pubkey,
|
|
std::{collections::hash_map::HashMap, sync::RwLock},
|
|
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)));
|
|
}
|
|
})
|
|
});
|
|
}
|