doprf.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion};
  2. use ff::Field;
  3. use rand::thread_rng;
  4. use utils::doprf::LegendrePrf;
  5. use utils::doprf::{DOPrfParty1, DOPrfParty2, DOPrfParty3};
  6. use utils::field::Fp;
  7. pub fn bench_legendre_prf(c: &mut Criterion) {
  8. let mut group = c.benchmark_group("LegendrePrf");
  9. group.bench_function("keygen", |b| {
  10. b.iter(|| black_box(LegendrePrf::<Fp>::key_gen()))
  11. });
  12. group.bench_function("eval", |b| {
  13. let key = LegendrePrf::<Fp>::key_gen();
  14. let x = Fp::random(thread_rng());
  15. b.iter(|| black_box(LegendrePrf::<Fp>::eval(&key, x)))
  16. });
  17. group.finish();
  18. }
  19. const LOG_NUM_EVALUATIONS: [usize; 4] = [4, 6, 8, 10];
  20. pub fn bench_doprf(c: &mut Criterion) {
  21. let mut group = c.benchmark_group("DOPrf");
  22. let mut party_1 = DOPrfParty1::<Fp>::new();
  23. let mut party_2 = DOPrfParty2::<Fp>::new();
  24. let mut party_3 = DOPrfParty3::<Fp>::new();
  25. group.bench_function("init", |b| {
  26. b.iter(|| {
  27. party_1.reset();
  28. party_2.reset();
  29. party_3.reset();
  30. let (msg_1_2, msg_1_3) = party_1.init_round_0();
  31. let (msg_2_1, msg_2_3) = party_2.init_round_0();
  32. let (msg_3_1, msg_3_2) = party_3.init_round_0();
  33. party_1.init_round_1(msg_2_1, msg_3_1);
  34. party_2.init_round_1(msg_1_2, msg_3_2);
  35. party_3.init_round_1(msg_1_3, msg_2_3);
  36. });
  37. });
  38. {
  39. party_1.reset();
  40. party_2.reset();
  41. party_3.reset();
  42. let (msg_1_2, msg_1_3) = party_1.init_round_0();
  43. let (msg_2_1, msg_2_3) = party_2.init_round_0();
  44. let (msg_3_1, msg_3_2) = party_3.init_round_0();
  45. party_1.init_round_1(msg_2_1, msg_3_1);
  46. party_2.init_round_1(msg_1_2, msg_3_2);
  47. party_3.init_round_1(msg_1_3, msg_2_3);
  48. }
  49. for log_num_evaluations in LOG_NUM_EVALUATIONS {
  50. group.bench_with_input(
  51. BenchmarkId::new("preprocess", log_num_evaluations),
  52. &log_num_evaluations,
  53. |b, &log_num_evaluations| {
  54. let num = 1 << log_num_evaluations;
  55. b.iter(|| {
  56. party_1.reset_preprocessing();
  57. party_2.reset_preprocessing();
  58. party_3.reset_preprocessing();
  59. let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num);
  60. let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num);
  61. let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num);
  62. party_1.preprocess_round_1(num, msg_2_1, msg_3_1);
  63. party_2.preprocess_round_1(num, msg_1_2, msg_3_2);
  64. party_3.preprocess_round_1(num, msg_1_3, msg_2_3);
  65. });
  66. },
  67. );
  68. }
  69. for log_num_evaluations in LOG_NUM_EVALUATIONS {
  70. group.bench_with_input(
  71. BenchmarkId::new("preprocess+eval", log_num_evaluations),
  72. &log_num_evaluations,
  73. |b, &log_num_evaluations| {
  74. let num = 1 << log_num_evaluations;
  75. let shares_1: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  76. let shares_2: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  77. let shares_3: Vec<Fp> = (0..num).map(|_| Fp::random(thread_rng())).collect();
  78. b.iter(|| {
  79. let (msg_1_2, msg_1_3) = party_1.preprocess_round_0(num);
  80. let (msg_2_1, msg_2_3) = party_2.preprocess_round_0(num);
  81. let (msg_3_1, msg_3_2) = party_3.preprocess_round_0(num);
  82. party_1.preprocess_round_1(num, msg_2_1, msg_3_1);
  83. party_2.preprocess_round_1(num, msg_1_2, msg_3_2);
  84. party_3.preprocess_round_1(num, msg_1_3, msg_2_3);
  85. let (msg_2_1, msg_2_3) = party_2.eval_round_0(num, &shares_2);
  86. let (msg_3_1, _) = party_3.eval_round_0(num, &shares_3);
  87. let (_, msg_1_3) = party_1.eval_round_1(num, &shares_1, &msg_2_1, &msg_3_1);
  88. let _output = party_3.eval_round_2(num, &shares_3, msg_1_3, msg_2_3);
  89. });
  90. },
  91. );
  92. }
  93. group.finish();
  94. }
  95. criterion_group!(
  96. name = benches;
  97. config = Criterion::default().sample_size(10);
  98. targets = bench_legendre_prf, bench_doprf
  99. );
  100. criterion_main!(benches);