hyperplonk/subroutines/benches/pcs_bench.rs
subroutines/benches/pcs_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 std::time::Instant;
6use subroutines::pcs::{
7 prelude::{MultilinearKzgPCS, PCSError, PolynomialCommitmentScheme},
8 StructuredReferenceString,
9};
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, 24)?;
20
21 for nv in 4..25 {
22 let repetition = if nv < 10 {
23 10
24 } else if nv < 20 {
25 5
26 } else {
27 2
28 };
29
30 let poly = Rc::new(DenseMultilinearExtension::rand(nv, &mut rng));
31 let (ck, vk) = uni_params.trim(nv)?;
32
33 let point: Vec<_> = (0..nv).map(|_| Fr::rand(&mut rng)).collect();
34
35 // commit
36 let com = {
37 let start = Instant::now();
38 for _ in 0..repetition {
39 let _commit = MultilinearKzgPCS::commit(&ck, &poly)?;
40 }
41
42 println!(
43 "KZG commit for {} variables: {} ns",
44 nv,
45 start.elapsed().as_nanos() / repetition as u128
46 );
47
48 MultilinearKzgPCS::commit(&ck, &poly)?
49 };
50
51 // open
52 let (proof, value) = {
53 let start = Instant::now();
54 for _ in 0..repetition {
55 let _open = MultilinearKzgPCS::open(&ck, &poly, &point)?;
56 }
57
58 println!(
59 "KZG open for {} variables: {} ns",
60 nv,
61 start.elapsed().as_nanos() / repetition as u128
62 );
63 MultilinearKzgPCS::open(&ck, &poly, &point)?
64 };
65
66 // verify
67 {
68 let start = Instant::now();
69 for _ in 0..repetition {
70 assert!(MultilinearKzgPCS::verify(
71 &vk, &com, &point, &value, &proof
72 )?);
73 }
74 println!(
75 "KZG verify for {} variables: {} ns",
76 nv,
77 start.elapsed().as_nanos() / repetition as u128
78 );
79 }
80
81 println!("====================================");
82 }
83
84 Ok(())
85}