cuckoo.rs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. let lookup_table =
  20. Hasher::<AesHashFunction<u32>, _>::compute_pos_lookup_table(domain_size, &hash_table);
  21. let lookup_table2 =
  22. Hasher::<AesHashFunction<u32>, _>::compute_pos_lookup_table(domain_size, &hash_table);
  23. let pos = |bucket_i: usize, item: u64| -> u64 {
  24. let idx = hash_table[bucket_i].partition_point(|x| x < &item);
  25. assert!(idx != hash_table[bucket_i].len());
  26. assert_eq!(item, hash_table[bucket_i][idx]);
  27. assert!(idx == 0 || hash_table[bucket_i][idx - 1] != item);
  28. idx as u64
  29. };
  30. let mut group = c.benchmark_group("position_map");
  31. group.bench_function("normal", |b| {
  32. b.iter(|| {
  33. for item in 0..domain_size {
  34. for &(bucket_i, _) in lookup_table[item as usize].iter() {
  35. let idx = pos(bucket_i, item);
  36. black_box(idx);
  37. }
  38. }
  39. })
  40. });
  41. group.bench_function("precomputed", |b| {
  42. b.iter(|| {
  43. for item in 0..domain_size {
  44. for &(bucket_i, _) in lookup_table[item as usize].iter() {
  45. let idx = Hasher::<AesHashFunction<u32>, _>::pos_lookup(
  46. &lookup_table2,
  47. bucket_i,
  48. item,
  49. );
  50. black_box(idx);
  51. }
  52. }
  53. })
  54. });
  55. group.finish();
  56. }
  57. pub fn bench_cuckoo_hash_items(c: &mut Criterion) {
  58. let number_inputs = 1_000;
  59. let parameters = Parameters::<AesHashFunction<u32>, _>::sample(number_inputs);
  60. let hasher = Hasher::new(parameters);
  61. let items: Vec<u64> = (0..number_inputs as u64).collect();
  62. c.bench_function("Hasher<AesHashFunction>.cuckoo_hash_items", |b| {
  63. b.iter(|| hasher.cuckoo_hash_items(black_box(&items)))
  64. });
  65. }
  66. criterion_group!(
  67. benches,
  68. bench_hash_domain_into_buckets,
  69. bench_position_map,
  70. bench_cuckoo_hash_items
  71. );
  72. criterion_main!(benches);