use anyhow::Result; use cess_hashers::{ poseidon::PoseidonDomain, poseidon::PoseidonHasher, sha256::Sha256Hasher, Domain, }; use cess_sp_core::merkle::{create_base_merkle_tree, BinaryMerkleTree}; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use rand::{thread_rng, Rng}; fn merkle_benchmark_sha256(c: &mut Criterion) { let params = if cfg!(feature = "big-sector-sizes-bench") { vec![128, 1024, 1_048_576] } else { vec![128, 1024] }; let mut group = c.benchmark_group("merkletree-binary"); for n_nodes in params { group.bench_function(format!("sha256-{}", n_nodes), |b| { let mut rng = thread_rng(); let data: Vec = (0..32 * n_nodes).map(|_| rng.gen()).collect(); b.iter(|| { black_box( create_base_merkle_tree::>(None, n_nodes, &data) .unwrap(), ) }) }); } group.finish(); } fn merkle_benchmark_poseidon(c: &mut Criterion) { let params = if cfg!(feature = "big-sector-sizes-bench") { vec![64, 128, 1024, 1_048_576] } else { vec![64, 128, 1024] }; let mut group = c.benchmark_group("merkletree-binary"); for n_nodes in params { group.bench_function(format!("poseidon-{}", n_nodes), |b| { let mut rng = thread_rng(); let mut data: Vec = Vec::with_capacity(32 * n_nodes); (0..n_nodes) .into_iter() .try_for_each(|_| -> Result<()> { let node = PoseidonDomain::random(&mut rng); data.extend(node.into_bytes()); Ok(()) }) .expect("failed to generate data"); b.iter(|| { black_box( create_base_merkle_tree::>( None, n_nodes, &data, ) .unwrap(), ) }) }); } group.finish(); } criterion_group!(benches, merkle_benchmark_sha256, merkle_benchmark_poseidon); criterion_main!(benches);