bucket_map.rs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #![feature(test)]
  2. macro_rules! DEFINE_NxM_BENCH {
  3. ($i:ident, $n:literal, $m:literal) => {
  4. mod $i {
  5. use super::*;
  6. #[bench]
  7. fn bench_insert_baseline_hashmap(bencher: &mut Bencher) {
  8. do_bench_insert_baseline_hashmap(bencher, $n, $m);
  9. }
  10. #[bench]
  11. fn bench_insert_bucket_map(bencher: &mut Bencher) {
  12. do_bench_insert_bucket_map(bencher, $n, $m);
  13. }
  14. }
  15. };
  16. }
  17. extern crate test;
  18. use {
  19. rayon::prelude::*,
  20. solana_bucket_map::bucket_map::{BucketMap, BucketMapConfig},
  21. solana_pubkey::Pubkey,
  22. std::{collections::hash_map::HashMap, sync::RwLock},
  23. test::Bencher,
  24. };
  25. type IndexValue = u64;
  26. DEFINE_NxM_BENCH!(dim_01x02, 1, 2);
  27. DEFINE_NxM_BENCH!(dim_02x04, 2, 4);
  28. DEFINE_NxM_BENCH!(dim_04x08, 4, 8);
  29. DEFINE_NxM_BENCH!(dim_08x16, 8, 16);
  30. DEFINE_NxM_BENCH!(dim_16x32, 16, 32);
  31. DEFINE_NxM_BENCH!(dim_32x64, 32, 64);
  32. /// Benchmark insert with Hashmap as baseline for N threads inserting M keys each
  33. fn do_bench_insert_baseline_hashmap(bencher: &mut Bencher, n: usize, m: usize) {
  34. let index = RwLock::new(HashMap::new());
  35. (0..n).into_par_iter().for_each(|i| {
  36. let key = Pubkey::new_unique();
  37. index
  38. .write()
  39. .unwrap()
  40. .insert(key, vec![(i, IndexValue::default())]);
  41. });
  42. bencher.iter(|| {
  43. (0..n).into_par_iter().for_each(|_| {
  44. for j in 0..m {
  45. let key = Pubkey::new_unique();
  46. index
  47. .write()
  48. .unwrap()
  49. .insert(key, vec![(j, IndexValue::default())]);
  50. }
  51. })
  52. });
  53. }
  54. /// Benchmark insert with BucketMap with N buckets for N threads inserting M keys each
  55. fn do_bench_insert_bucket_map(bencher: &mut Bencher, n: usize, m: usize) {
  56. let index = BucketMap::new(BucketMapConfig::new(n));
  57. (0..n).into_par_iter().for_each(|i| {
  58. let key = Pubkey::new_unique();
  59. index.update(&key, |_| Some((vec![(i, IndexValue::default())], 0)));
  60. });
  61. bencher.iter(|| {
  62. (0..n).into_par_iter().for_each(|_| {
  63. for j in 0..m {
  64. let key = Pubkey::new_unique();
  65. index.update(&key, |_| Some((vec![(j, IndexValue::default())], 0)));
  66. }
  67. })
  68. });
  69. }