From fb74a20cd2bcaf90a81583538653a4673747fd19 Mon Sep 17 00:00:00 2001 From: Balazs Komuves Date: Thu, 22 Jan 2026 22:36:25 +0100 Subject: [PATCH] add a very simple bench --- Cargo.toml | 6 ++--- README.md | 2 +- benches/iterated_perm.rs | 54 ++++++++++++++++++++++++++++++++++++++++ src/bin/testmain.rs | 15 +++++++++++ 4 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 benches/iterated_perm.rs diff --git a/Cargo.toml b/Cargo.toml index b35baf2..8914e42 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,6 @@ name = "testmain" test = false bench = false -#[[bench]] -#name = "iterated_perm" -#harness = false +[[bench]] +name = "iterated_perm" +harness = false diff --git a/README.md b/README.md index 51ba3a0..4c22ca8 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ and [`staging-agda`](https://github.com/faulhornlabs/staging-agda/). ### TODO -- [ ] optimize squaring to use less multiplication +- [ ] optimize squaring to use less multiplications - [ ] benchmark RISC-V cycles - [ ] add more Poseidon2 state widths than `t=3` - [ ] implement `circomlib`-compatible Poseidon diff --git a/benches/iterated_perm.rs b/benches/iterated_perm.rs new file mode 100644 index 0000000..4c5b0a0 --- /dev/null +++ b/benches/iterated_perm.rs @@ -0,0 +1,54 @@ + +use criterion::{black_box, criterion_group, criterion_main, Criterion}; + +use rust_poseidon_bn254_pure::bn254::field::*; +use rust_poseidon_bn254_pure::poseidon2::permutation::*; + +//------------------------------------------------------------------------------ + +type State = (Felt,Felt,Felt); + +fn initial_state() -> State { + ( Felt::from_u32(0) + , Felt::from_u32(1) + , Felt::from_u32(2) + ) +} + +fn iterate_perm(n: usize) -> State { + let mut state: State = initial_state(); + for _i in 0..n { + state = permute_felt(&state); + } + state +} + +// for a Merkle tree update with depth 20, we need 20 permutation calls +fn twenty_permutations() -> State { + let mut state: State = initial_state(); + iterate_perm(20); + state +} + +fn bench_iterated_perm(c: &mut Criterion , n: usize) { + let msg = format!("Poseidon2 permutation iterated {} times", n); + c.bench_function(&msg, |b| b.iter(|| iterate_perm(black_box(n)) )); +} + +fn bench_twenty(c: &mut Criterion) { + let msg = format!("Poseidon2 permutation iterated 20 times"); + c.bench_function(&msg, |b| b.iter(|| twenty_permutations() )); +} + +//------------------------------------------------------------------------------ + +fn bench_permutations(c: &mut Criterion) { + bench_iterated_perm(c, 1000); + bench_twenty(c); +} + +//------------------------------------------------------------------------------ + +criterion_group!(benches, bench_permutations); +criterion_main!(benches); + diff --git a/src/bin/testmain.rs b/src/bin/testmain.rs index 2a3719e..b96cd50 100644 --- a/src/bin/testmain.rs +++ b/src/bin/testmain.rs @@ -1,4 +1,6 @@ +use std::time::Instant; + use rust_poseidon_bn254_pure::bn254::bigint::*; use rust_poseidon_bn254_pure::bn254::constant::*; use rust_poseidon_bn254_pure::bn254::montgomery::*; @@ -124,6 +126,19 @@ fn main() { println!("z' = {}", output.2 ); println!(""); + println!("poseidon2 iterated 10,000 times:"); + println!(""); + + let now = Instant::now(); + let mut state: (Felt,Felt,Felt) = input.clone(); + for _i in 0..10000 { + state = permute_felt(&state); + } + println!("x'' = {}", state.0 ); + println!("y'' = {}", state.1 ); + println!("z'' = {}", state.2 ); + let elapsed = now.elapsed(); + println!("Elapsed: {:.3?}", elapsed); //----------------------------------------------------------------------------