arnaucube
arnaucube/hyperplonkPublic Self-hosted repository
hyperplonk/pcs/benches/bench.rs
pcs/benches/bench.rsRaw
 1use ark_bls12_381::{Bls12_381, Fr};
 2use ark_ff::UniformRand;
 3use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
 4use ark_std::{rc::Rc, test_rng};
 5use pcs::{
 6    prelude::{MultilinearKzgPCS, PCSError, PolynomialCommitmentScheme},
 7    StructuredReferenceString,
 8};
 9use std::time::Instant;
10
11fn main() -> Result<(), PCSError> {
12    bench_pcs()
13}
14
15fn bench_pcs() -> Result<(), PCSError> {
16    let mut rng = test_rng();
17
18    // normal polynomials
19    let uni_params = MultilinearKzgPCS::<Bls12_381>::gen_srs_for_testing(&mut rng, 18)?;
20
21    for nv in 4..19 {
22        let repetition = if nv < 10 {
23            100
24        } else if nv < 20 {
25            50
26        } else {
27            10
28        };
29
30        let poly = Rc::new(DenseMultilinearExtension::rand(nv, &mut rng));
31        let (ml_ck, ml_vk) = uni_params.0.trim(nv)?;
32        let (uni_ck, uni_vk) = uni_params.1.trim(nv)?;
33        let ck = (ml_ck, uni_ck);
34        let vk = (ml_vk, uni_vk);
35
36        let point: Vec<_> = (0..nv).map(|_| Fr::rand(&mut rng)).collect();
37
38        // commit
39        let com = {
40            let start = Instant::now();
41            for _ in 0..repetition {
42                let _commit = MultilinearKzgPCS::commit(&ck, &poly)?;
43            }
44
45            println!(
46                "KZG commit for {} variables: {} ns",
47                nv,
48                start.elapsed().as_nanos() / repetition as u128
49            );
50
51            MultilinearKzgPCS::commit(&ck, &poly)?
52        };
53
54        // open
55        let (proof, value) = {
56            let start = Instant::now();
57            for _ in 0..repetition {
58                let _open = MultilinearKzgPCS::open(&ck, &poly, &point)?;
59            }
60
61            println!(
62                "KZG open for {} variables: {} ns",
63                nv,
64                start.elapsed().as_nanos() / repetition as u128
65            );
66            MultilinearKzgPCS::open(&ck, &poly, &point)?
67        };
68
69        // verify
70        {
71            let start = Instant::now();
72            for _ in 0..repetition {
73                assert!(MultilinearKzgPCS::verify(
74                    &vk, &com, &point, &value, &proof
75                )?);
76            }
77            println!(
78                "KZG verify for {} variables: {} ns",
79                nv,
80                start.elapsed().as_nanos() / repetition as u128
81            );
82        }
83
84        println!("====================================");
85    }
86
87    Ok(())
88}