hyperplonk/subroutines/benches/pcs_bench.rs
subroutines/benches/pcs_bench.rsRaw
1// Copyright (c) 2023 Espresso Systems (espressosys.com)
2// This file is part of the HyperPlonk library.
3
4// You should have received a copy of the MIT License
5// along with the HyperPlonk library. If not, see <https://mit-license.org/>.
6
7use ark_bls12_381::{Bls12_381, Fr};
8use ark_ff::UniformRand;
9use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
10use ark_std::{sync::Arc, test_rng};
11use std::time::Instant;
12use subroutines::pcs::{
13 prelude::{MultilinearKzgPCS, PCSError, PolynomialCommitmentScheme},
14 StructuredReferenceString,
15};
16
17fn main() -> Result<(), PCSError> {
18 bench_pcs()
19}
20
21fn bench_pcs() -> Result<(), PCSError> {
22 let mut rng = test_rng();
23
24 // normal polynomials
25 let uni_params = MultilinearKzgPCS::<Bls12_381>::gen_srs_for_testing(&mut rng, 24)?;
26
27 for nv in 4..25 {
28 let repetition = if nv < 10 {
29 10
30 } else if nv < 20 {
31 5
32 } else {
33 2
34 };
35
36 let poly = Arc::new(DenseMultilinearExtension::rand(nv, &mut rng));
37 let (ck, vk) = uni_params.trim(nv)?;
38
39 let point: Vec<_> = (0..nv).map(|_| Fr::rand(&mut rng)).collect();
40
41 // commit
42 let com = {
43 let start = Instant::now();
44 for _ in 0..repetition {
45 let _commit = MultilinearKzgPCS::commit(&ck, &poly)?;
46 }
47
48 println!(
49 "KZG commit for {} variables: {} ns",
50 nv,
51 start.elapsed().as_nanos() / repetition as u128
52 );
53
54 MultilinearKzgPCS::commit(&ck, &poly)?
55 };
56
57 // open
58 let (proof, value) = {
59 let start = Instant::now();
60 for _ in 0..repetition {
61 let _open = MultilinearKzgPCS::open(&ck, &poly, &point)?;
62 }
63
64 println!(
65 "KZG open for {} variables: {} ns",
66 nv,
67 start.elapsed().as_nanos() / repetition as u128
68 );
69 MultilinearKzgPCS::open(&ck, &poly, &point)?
70 };
71
72 // verify
73 {
74 let start = Instant::now();
75 for _ in 0..repetition {
76 assert!(MultilinearKzgPCS::verify(
77 &vk, &com, &point, &value, &proof
78 )?);
79 }
80 println!(
81 "KZG verify for {} variables: {} ns",
82 nv,
83 start.elapsed().as_nanos() / repetition as u128
84 );
85 }
86
87 println!("====================================");
88 }
89
90 Ok(())
91}