cuckoo.rs 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. use criterion::{black_box, criterion_group, criterion_main, Criterion};
  2. use cuckoo::cuckoo::{Hasher, Parameters};
  3. use cuckoo::hash::AesHashFunction;
  4. pub fn bench_hash_domain_into_buckets(c: &mut Criterion) {
  5. let number_inputs = 1_000;
  6. let parameters = Parameters::<AesHashFunction<u32>, _>::sample(number_inputs);
  7. let hasher = Hasher::new(parameters);
  8. let domain_size = 100_000;
  9. c.bench_function("Hasher<AesHashFunction>.hash_domain_into_buckets", |b| {
  10. b.iter(|| hasher.hash_domain_into_buckets(black_box(domain_size)))
  11. });
  12. }
  13. pub fn bench_position_map(c: &mut Criterion) {
  14. let number_inputs = 1_000;
  15. let parameters = Parameters::<AesHashFunction<u32>, _>::sample(number_inputs);
  16. let hasher = Hasher::new(parameters);
  17. let domain_size = 100_000;
  18. let hash_table = hasher.hash_domain_into_buckets(domain_size);
  19. // (ab)use one lookup table to obtain the input pairs for pos
  20. let values =
  21. Hasher::<AesHashFunction<u32>, _>::compute_pos_lookup_table(domain_size, &hash_table);
  22. let pos = |bucket_i: usize, item: u64| -> u64 {
  23. let idx = hash_table[bucket_i].partition_point(|x| x < &item);
  24. assert!(idx != hash_table[bucket_i].len());
  25. assert_eq!(item, hash_table[bucket_i][idx]);
  26. assert!(idx == 0 || hash_table[bucket_i][idx - 1] != item);
  27. idx as u64
  28. };
  29. let mut group = c.benchmark_group("position_map");
  30. group.bench_function("search", |b| {
  31. b.iter(|| {
  32. for item in 0..domain_size {
  33. for &(bucket_i, _) in values[item as usize].iter() {
  34. let idx = pos(bucket_i, item);
  35. black_box(idx);
  36. }
  37. }
  38. })
  39. });
  40. group.bench_function("lookup", |b| {
  41. let pos_lookup_table =
  42. Hasher::<AesHashFunction<u32>, _>::compute_pos_lookup_table(domain_size, &hash_table);
  43. b.iter(|| {
  44. for item in 0..domain_size {
  45. for &(bucket_i, _) in values[item as usize].iter() {
  46. let idx = Hasher::<AesHashFunction<u32>, _>::pos_lookup(
  47. &pos_lookup_table,
  48. bucket_i,
  49. item,
  50. );
  51. black_box(idx);
  52. }
  53. }
  54. })
  55. });
  56. group.bench_function("precomputation+lookup", |b| {
  57. b.iter(|| {
  58. let pos_lookup_table = Hasher::<AesHashFunction<u32>, _>::compute_pos_lookup_table(
  59. domain_size,
  60. &hash_table,
  61. );
  62. for item in 0..domain_size {
  63. for &(bucket_i, _) in values[item as usize].iter() {
  64. let idx = Hasher::<AesHashFunction<u32>, _>::pos_lookup(
  65. &pos_lookup_table,
  66. bucket_i,
  67. item,
  68. );
  69. black_box(idx);
  70. }
  71. }
  72. })
  73. });
  74. group.finish();
  75. }
  76. pub fn bench_cuckoo_hash_items(c: &mut Criterion) {
  77. let number_inputs = 1_000;
  78. let parameters = Parameters::<AesHashFunction<u32>, _>::sample(number_inputs);
  79. let hasher = Hasher::new(parameters);
  80. let items: Vec<u64> = (0..number_inputs as u64).collect();
  81. c.bench_function("Hasher<AesHashFunction>.cuckoo_hash_items", |b| {
  82. b.iter(|| hasher.cuckoo_hash_items(black_box(&items)))
  83. });
  84. }
  85. criterion_group!(
  86. benches,
  87. bench_hash_domain_into_buckets,
  88. bench_position_map,
  89. bench_cuckoo_hash_items
  90. );
  91. criterion_main!(benches);