hyperplonk/poly-iop/benches/bench.rs
poly-iop/benches/bench.rsRaw
1use std::time::Instant;
2
3use ark_bls12_381::Fr;
4use ark_std::test_rng;
5use poly_iop::{PolyIOP, PolyIOPErrors, SumCheck, VirtualPolynomial, ZeroCheck};
6
7fn main() -> Result<(), PolyIOPErrors> {
8 bench_sum_check()?;
9 println!("\n\n");
10 bench_zero_check()
11}
12
13fn bench_sum_check() -> Result<(), PolyIOPErrors> {
14 let mut rng = test_rng();
15 for degree in 2..4 {
16 for nv in 4..25 {
17 let repetition = if nv < 10 {
18 100
19 } else if nv < 20 {
20 50
21 } else {
22 10
23 };
24
25 let (poly, asserted_sum) =
26 VirtualPolynomial::rand(nv, (degree, degree + 1), 2, &mut rng)?;
27 let poly_info = poly.domain_info.clone();
28 let proof = {
29 let start = Instant::now();
30 let mut transcript = <PolyIOP<Fr> as SumCheck<Fr>>::init_transcript();
31 let proof = <PolyIOP<Fr> as SumCheck<Fr>>::prove(&poly, &mut transcript)?;
32
33 println!(
34 "sum check proving time for {} variables and {} degree: {} ns",
35 nv,
36 degree,
37 start.elapsed().as_nanos() / repetition as u128
38 );
39 proof
40 };
41
42 {
43 let start = Instant::now();
44 let mut transcript = <PolyIOP<Fr> as SumCheck<Fr>>::init_transcript();
45 let subclaim = <PolyIOP<Fr> as SumCheck<Fr>>::verify(
46 asserted_sum,
47 &proof,
48 &poly_info,
49 &mut transcript,
50 )?;
51 assert!(
52 poly.evaluate(&subclaim.point).unwrap() == subclaim.expected_evaluation,
53 "wrong subclaim"
54 );
55
56 println!(
57 "sum check verification time for {} variables: {} ns",
58 nv,
59 start.elapsed().as_nanos() / repetition as u128
60 );
61 }
62
63 println!("====================================");
64 }
65 }
66 Ok(())
67}
68
69fn bench_zero_check() -> Result<(), PolyIOPErrors> {
70 let mut rng = test_rng();
71 for degree in 2..4 {
72 for nv in 4..20 {
73 let repetition = if nv < 10 {
74 100
75 } else if nv < 20 {
76 50
77 } else {
78 10
79 };
80
81 let poly = VirtualPolynomial::rand_zero(nv, (degree, degree + 1), 2, &mut rng)?;
82 let poly_info = poly.domain_info.clone();
83 let proof = {
84 let start = Instant::now();
85 let mut transcript = <PolyIOP<Fr> as ZeroCheck<Fr>>::init_transcript();
86 transcript.append_message(b"testing", b"initializing transcript for testing")?;
87 let proof = <PolyIOP<Fr> as ZeroCheck<Fr>>::prove(&poly, &mut transcript)?;
88
89 println!(
90 "zero check proving time for {} variables and {} degree: {} ns",
91 nv,
92 degree,
93 start.elapsed().as_nanos() / repetition as u128
94 );
95 proof
96 };
97
98 {
99 let start = Instant::now();
100 let mut transcript = <PolyIOP<Fr> as ZeroCheck<Fr>>::init_transcript();
101 transcript.append_message(b"testing", b"initializing transcript for testing")?;
102 let subclaim =
103 <PolyIOP<Fr> as ZeroCheck<Fr>>::verify(&proof, &poly_info, &mut transcript)?.0;
104 assert!(
105 poly.evaluate(&subclaim.point)? == subclaim.expected_evaluation,
106 "wrong subclaim"
107 );
108 println!(
109 "zero check verification time for {} variables: {} ns",
110 nv,
111 start.elapsed().as_nanos() / repetition as u128
112 );
113 }
114
115 println!("====================================");
116 }
117 }
118 Ok(())
119}