weighted_shuffle.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. use {
  2. criterion::{criterion_group, criterion_main, Criterion},
  3. rand::{Rng, SeedableRng},
  4. rand_chacha::ChaChaRng,
  5. solana_gossip::weighted_shuffle::WeightedShuffle,
  6. std::{hint::black_box, iter::repeat_with},
  7. };
  8. fn make_weights<R: Rng>(rng: &mut R) -> Vec<u64> {
  9. repeat_with(|| rng.gen_range(1..10_000))
  10. .take(4_000)
  11. .collect()
  12. }
  13. fn bench_weighted_shuffle_new(c: &mut Criterion) {
  14. let mut rng = rand::thread_rng();
  15. c.bench_function("bench_weighted_shuffle_new", |b| {
  16. b.iter(|| {
  17. let weights = make_weights(&mut rng);
  18. black_box(WeightedShuffle::new("", &weights));
  19. })
  20. });
  21. }
  22. fn bench_weighted_shuffle_shuffle(c: &mut Criterion) {
  23. let mut seed = [0u8; 32];
  24. let mut rng = rand::thread_rng();
  25. let weights = make_weights(&mut rng);
  26. let weighted_shuffle = WeightedShuffle::new("", weights);
  27. c.bench_function("bench_weighted_shuffle_shuffle", |b| {
  28. b.iter(|| {
  29. rng.fill(&mut seed[..]);
  30. let mut rng = ChaChaRng::from_seed(seed);
  31. weighted_shuffle
  32. .clone()
  33. .shuffle(&mut rng)
  34. .for_each(|index| {
  35. black_box(index);
  36. })
  37. })
  38. });
  39. c.bench_function("bench_weighted_shuffle_collect", |b| {
  40. b.iter(|| {
  41. rng.fill(&mut seed[..]);
  42. let mut rng = ChaChaRng::from_seed(seed);
  43. let mut weighted_shuffle = weighted_shuffle.clone();
  44. let shuffle = weighted_shuffle.shuffle(&mut rng);
  45. black_box(shuffle.collect::<Vec<_>>());
  46. })
  47. });
  48. }
  49. criterion_group!(
  50. benches,
  51. bench_weighted_shuffle_new,
  52. bench_weighted_shuffle_shuffle,
  53. );
  54. criterion_main!(benches);