Skip to content

Conversation

@Ben-PH
Copy link

@Ben-PH Ben-PH commented May 1, 2025

NOTE: While this is in draft phase, I'll be working using the changes made in the add-rust-overlay branch

We currently use an internal implementation of the Poseidon hashing algorithm.

There are other implementations of Poseidon, and we need empirical data to make future decisions.

Initial plan

  • familiarise myself with existing benchmarks
  • add/refine to the benchmarks
  • bring in light_poseidon (and other promising impls)
  • deploy the hasher thunder-dome, and get some answers.
Notes taken

light_poseidon parameters:

/// Parameters for the Poseidon hash algorithm.
pub struct PoseidonParameters<F: PrimeField> {
    /// Round constants.
    pub ark: Vec<F>,
    /// MDS matrix.
    pub mds: Vec<Vec<F>>,
    /// Number of full rounds (where S-box is applied to all elements of the
    /// state).
    pub full_rounds: usize,
    /// Number of partial rounds (where S-box is applied only to the first
    /// element of the state).
    pub partial_rounds: usize,
    /// Number of prime fields in the state.
    pub width: usize,
    /// Exponential used in S-box to power elements of the state.
    pub alpha: u64,
}

our corresponding struct:

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct RoundParameters<F: PrimeField> {
    /// input-length + 1
    pub rate: usize,
    pub n_rounds_full: usize,
    pub n_rounds_partial: usize,
    pub skip_matrices: usize,
    pub ark_consts: Vec<F>,
    pub mds: Vec<Vec<F>>,
}

...but for our impl, you must provide an array of tuples to create what is a vector of parameters, e.g.:

// rate, full rounds, partial rounds, skip matrix
const ROUND_PARAMS: [(usize, usize, usize, usize); 8] = [
    (2, 8, 56, 0),
    (3, 8, 57, 0),
    (4, 8, 56, 0),
    (5, 8, 60, 0),
    (6, 8, 60, 0),
    (7, 8, 63, 0),
    (8, 8, 64, 0),
    (9, 8, 63, 0),
];

...which for this e.g. provides:

r   f  p   s  clen mlen
(2, 8, 56, 0, 128, 2)
(3, 8, 57, 0, 195, 3)
(4, 8, 56, 0, 256, 4)
(5, 8, 60, 0, 340, 5)
(6, 8, 60, 0, 408, 6)
(7, 8, 63, 0, 497, 7)
(8, 8, 64, 0, 576, 8)
(9, 8, 63, 0, 639, 9)

looking at the implementation, this collection of parameters gets selected at runtime:

    pub fn hash(&self, inp: &[F]) -> Result<F, String> {
        // Note that the rate becomes input length + 1; hence for length N we pick parameters with T = N + 1
        let rate = inp.len() + 1;

        // We seek the index (Poseidon's round_params is an ordered vector) for the parameters corresponding to `rate`
        let param_index = self.round_params.iter().position(|el| el.rate == rate);

...and the chosen param_index is the entry in the collection of generated parameters.

As for difference in params: we have the skip matrix field, they have the alpha field.

The light-poseidon ecosystem generates 5 for the alpha field when generating for bn254_x5. I need to investigate this parameter.

Our benchmarks do not use skip matrices.

Initial results:

image

@Ben-PH Ben-PH self-assigned this May 1, 2025
@github-actions
Copy link

github-actions bot commented May 1, 2025

Benchmark for d1d077a

Click to view benchmark
Test Base PR %
FullMerkleTree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::delete 875.7±9.83ns 890.7±18.77ns +1.71%
FullMerkleTree::get 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::get_empty_leaves_indices 7.8±0.08ns 7.8±0.10ns 0.00%
FullMerkleTree::get_subtree_root 3.7±0.14ns 3.7±0.11ns 0.00%
FullMerkleTree::override_range 1357.5±16.54ns 1357.3±16.75ns -0.01%
FullMerkleTree::set 876.0±48.09ns 875.6±13.02ns -0.05%
OptimalMerkleTree::compute_root 1034.2±57.55ns 1016.9±7.68ns -1.67%
OptimalMerkleTree::delete 1017.0±6.88ns 1032.1±15.10ns +1.48%
OptimalMerkleTree::get 22.5±0.34ns 24.4±0.58ns +8.44%
OptimalMerkleTree::get_empty_leaves_indices 7.5±0.21ns 7.5±0.11ns 0.00%
OptimalMerkleTree::get_subtree_root 24.1±0.26ns 24.5±0.41ns +1.66%
OptimalMerkleTree::override_range 1154.4±10.08ns 1160.9±32.42ns +0.56%
OptimalMerkleTree::set 1014.1±10.29ns 1024.9±12.90ns +1.06%
poseidon Fr/Array hash/10 139.5±0.74µs 70.0 KElem/sec N/A N/A
poseidon Fr/Array hash/100 1501.7±1.86µs 65.0 KElem/sec N/A N/A
poseidon Fr/Array hash/1000 15.2±0.03ms 64.4 KElem/sec N/A N/A
poseidon Fr/Single hash 13.8±0.02µs 69.0 MElem/sec N/A N/A

@github-actions
Copy link

github-actions bot commented May 1, 2025

Benchmark for d1d077a

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 13.3±0.63ms 12.2±0.10ms -8.27%
OptimalMerkleTree::::full_height_gen 795.5±16.51µs 783.4±9.75µs -1.52%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 381.4±6.00ns 374.4±6.71ns -1.84%
Pmtree::get_empty_leaves_indices 8.7±0.09ns 8.7±0.12ns 0.00%
Pmtree::get_subtree_root 547.4±12.51ns 550.8±5.15ns +0.62%
Pmtree::override_range 227.5±3.64µs 232.5±9.56µs +2.20%
Pmtree::set 50.6±0.24µs 50.8±0.46µs +0.40%
Pmtree:delete 50.7±0.86µs 50.9±0.53µs +0.39%
Set/FullMerkleTree::::set/1 513.7±4.44µs 515.4±4.82µs +0.33%
Set/FullMerkleTree::::set/10 5.1±0.02ms 5.2±0.02ms +1.96%
Set/FullMerkleTree::::set/100 51.7±0.12ms 51.7±0.14ms 0.00%
Set/FullMerkleTree::::set_range/1 514.1±4.41µs 515.1±4.89µs +0.19%
Set/FullMerkleTree::::set_range/10 703.2±3.42µs 705.1±6.71µs +0.27%
Set/FullMerkleTree::::set_range/100 3.1±0.00ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 515.5±5.08µs 515.2±4.76µs -0.06%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.01ms 0.00%
Set/OptimalMerkleTree::::set/100 53.4±2.23ms 53.2±0.39ms -0.37%
Set/OptimalMerkleTree::::set_range/1 514.4±4.51µs 513.9±3.88µs -0.10%
Set/OptimalMerkleTree::::set_range/10 704.8±4.44µs 705.9±4.30µs +0.16%
Set/OptimalMerkleTree::::set_range/100 3.0±0.00ms 3.0±0.01ms 0.00%
zkey::zkey_from_raw 679.2±0.60ms 679.2±0.64ms 0.00%

@github-actions
Copy link

github-actions bot commented May 1, 2025

Benchmark for d1d077a

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 13.0±0.20ms 13.3±0.20ms +2.31%
OptimalMerkleTree::::full_height_gen 781.9±7.30µs 798.6±9.66µs +2.14%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 373.4±2.73ns 371.9±4.80ns -0.40%
Pmtree::get_empty_leaves_indices 8.7±0.11ns 8.7±0.11ns 0.00%
Pmtree::get_subtree_root 542.8±5.07ns 542.3±6.99ns -0.09%
Pmtree::override_range 226.8±3.62µs 227.4±5.00µs +0.26%
Pmtree::set 50.0±0.49µs 50.1±1.01µs +0.20%
Pmtree:delete 50.1±0.34µs 50.0±0.40µs -0.20%
Set/FullMerkleTree::::set/1 513.8±3.04µs 514.6±6.11µs +0.16%
Set/FullMerkleTree::::set/10 5.2±0.01ms 5.2±0.02ms 0.00%
Set/FullMerkleTree::::set/100 51.8±0.36ms 51.7±0.17ms -0.19%
Set/FullMerkleTree::::set_range/1 513.6±2.19µs 513.9±3.22µs +0.06%
Set/FullMerkleTree::::set_range/10 704.0±3.20µs 703.4±4.46µs -0.09%
Set/FullMerkleTree::::set_range/100 3.1±0.02ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 515.0±4.64µs 514.6±4.69µs -0.08%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.01ms 0.00%
Set/OptimalMerkleTree::::set/100 53.2±0.09ms 53.2±0.12ms 0.00%
Set/OptimalMerkleTree::::set_range/1 516.1±4.55µs 515.1±4.74µs -0.19%
Set/OptimalMerkleTree::::set_range/10 705.6±4.93µs 705.1±4.83µs -0.07%
Set/OptimalMerkleTree::::set_range/100 3.0±0.00ms 3.0±0.00ms 0.00%
arkzkey::arkzkey_from_raw_uncompressed 5.8±0.03ms 5.7±0.00ms -1.72%
zkey::zkey_from_raw 681.4±0.66ms 681.7±1.29ms +0.04%

@Ben-PH Ben-PH force-pushed the poseidon_hash_benchie-bph branch from 288a2d7 to ad2896a Compare May 4, 2025 11:49
@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for 30da07c

Click to view benchmark
Test Base PR %
FullMerkleTree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::delete 868.3±4.84ns 868.9±6.98ns +0.07%
FullMerkleTree::get 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::get_empty_leaves_indices 7.8±0.06ns 7.8±0.12ns 0.00%
FullMerkleTree::get_subtree_root 3.8±0.05ns 3.8±0.09ns 0.00%
FullMerkleTree::override_range 1351.2±18.29ns 1350.5±21.06ns -0.05%
FullMerkleTree::set 875.9±9.59ns 884.7±20.78ns +1.00%
OptimalMerkleTree::compute_root 1014.6±11.58ns 1005.4±20.77ns -0.91%
OptimalMerkleTree::delete 1023.6±11.77ns 1046.0±69.91ns +2.19%
OptimalMerkleTree::get 22.1±0.24ns 22.4±0.44ns +1.36%
OptimalMerkleTree::get_empty_leaves_indices 7.5±0.10ns 7.5±0.11ns 0.00%
OptimalMerkleTree::get_subtree_root 24.2±0.37ns 24.5±0.74ns +1.24%
OptimalMerkleTree::override_range 1150.8±17.30ns 1149.4±10.31ns -0.12%
OptimalMerkleTree::set 1019.4±11.23ns 1046.8±13.74ns +2.69%
poseidon Fr/Array hash/10 139.2±0.16µs 70.1 KElem/sec N/A N/A
poseidon Fr/Array hash/100 1503.2±1.44µs 65.0 KElem/sec N/A N/A
poseidon Fr/Array hash/1000 15.2±0.03ms 64.4 KElem/sec N/A N/A
poseidon Fr/Single hash 13.8±0.01µs 69.1 MElem/sec N/A N/A

@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for 30da07c

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 12.8±0.15ms 12.8±0.07ms 0.00%
OptimalMerkleTree::::full_height_gen 790.7±54.54µs 795.6±5.43µs +0.62%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 368.4±4.88ns 371.4±18.20ns +0.81%
Pmtree::get_empty_leaves_indices 8.7±0.12ns 8.7±0.17ns 0.00%
Pmtree::get_subtree_root 549.3±7.45ns 540.3±6.89ns -1.64%
Pmtree::override_range 224.0±2.95µs 229.6±8.08µs +2.50%
Pmtree::set 50.6±0.37µs 50.9±1.95µs +0.59%
Pmtree:delete 50.7±0.60µs 50.8±1.19µs +0.20%
Set/FullMerkleTree::::set/1 513.6±6.32µs 517.9±6.11µs +0.84%
Set/FullMerkleTree::::set/10 5.2±0.02ms 5.2±0.27ms 0.00%
Set/FullMerkleTree::::set/100 51.7±0.26ms 51.7±0.26ms 0.00%
Set/FullMerkleTree::::set_range/1 514.0±5.87µs 514.1±4.97µs +0.02%
Set/FullMerkleTree::::set_range/10 705.0±6.84µs 708.9±23.14µs +0.55%
Set/FullMerkleTree::::set_range/100 3.1±0.01ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 511.7±4.82µs 515.5±4.73µs +0.74%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.03ms 0.00%
Set/OptimalMerkleTree::::set/100 53.6±2.01ms 53.2±0.13ms -0.75%
Set/OptimalMerkleTree::::set_range/1 515.8±4.51µs 515.6±5.35µs -0.04%
Set/OptimalMerkleTree::::set_range/10 707.2±5.92µs 705.0±2.88µs -0.31%
Set/OptimalMerkleTree::::set_range/100 3.0±0.16ms 3.0±0.01ms 0.00%
zkey::zkey_from_raw 679.0±1.22ms 687.1±11.80ms +1.19%

@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for 30da07c

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 12.4±0.27ms 12.3±0.24ms -0.81%
OptimalMerkleTree::::full_height_gen 769.8±18.70µs 783.4±32.02µs +1.77%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 367.3±10.48ns 398.1±9.72ns +8.39%
Pmtree::get_empty_leaves_indices 8.6±0.23ns 8.6±0.21ns 0.00%
Pmtree::get_subtree_root 524.1±14.06ns 557.9±14.96ns +6.45%
Pmtree::override_range 221.7±4.29µs 221.8±5.89µs +0.05%
Pmtree::set 49.3±1.48µs 48.7±1.31µs -1.22%
Pmtree:delete 49.5±0.97µs 48.7±1.51µs -1.62%
Set/FullMerkleTree::::set/1 497.5±13.82µs 500.7±12.93µs +0.64%
Set/FullMerkleTree::::set/10 5.0±0.14ms 5.1±0.13ms +2.00%
Set/FullMerkleTree::::set/100 50.0±1.11ms 50.8±1.09ms +1.60%
Set/FullMerkleTree::::set_range/1 498.6±14.91µs 503.6±11.07µs +1.00%
Set/FullMerkleTree::::set_range/10 679.1±15.85µs 690.7±17.47µs +1.71%
Set/FullMerkleTree::::set_range/100 3.0±0.07ms 3.0±0.07ms 0.00%
Set/OptimalMerkleTree::::set/1 508.8±11.54µs 509.8±10.50µs +0.20%
Set/OptimalMerkleTree::::set/10 5.3±0.07ms 5.1±0.12ms -3.77%
Set/OptimalMerkleTree::::set/100 53.0±0.98ms 51.4±1.23ms -3.02%
Set/OptimalMerkleTree::::set_range/1 513.5±8.86µs 502.3±17.18µs -2.18%
Set/OptimalMerkleTree::::set_range/10 682.8±16.42µs 688.3±15.72µs +0.81%
Set/OptimalMerkleTree::::set_range/100 2.9±0.07ms 2.9±0.07ms 0.00%
arkzkey::arkzkey_from_raw_uncompressed 5.7±0.05ms 5.6±0.12ms -1.75%
zkey::zkey_from_raw 672.6±8.18ms 663.0±8.57ms -1.43%

@Ben-PH Ben-PH force-pushed the poseidon_hash_benchie-bph branch from ad2896a to e64ad17 Compare May 4, 2025 12:19
@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for ed52774

Click to view benchmark
Test Base PR %
FullMerkleTree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::delete 879.8±8.67ns 885.9±13.23ns +0.69%
FullMerkleTree::get 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::get_empty_leaves_indices 7.8±0.14ns 7.8±0.36ns 0.00%
FullMerkleTree::get_subtree_root 3.8±0.14ns 3.7±0.20ns -2.63%
FullMerkleTree::override_range 1350.8±19.51ns 1367.9±31.63ns +1.27%
FullMerkleTree::set 879.0±10.55ns 874.2±12.27ns -0.55%
OptimalMerkleTree::compute_root 1006.8±12.90ns 1005.3±20.46ns -0.15%
OptimalMerkleTree::delete 1039.7±10.99ns 1012.8±29.49ns -2.59%
OptimalMerkleTree::get 22.4±0.73ns 22.4±0.21ns 0.00%
OptimalMerkleTree::get_empty_leaves_indices 7.5±0.07ns 7.5±0.13ns 0.00%
OptimalMerkleTree::get_subtree_root 32.8±0.69ns 24.1±0.25ns -26.52%
OptimalMerkleTree::override_range 1152.7±17.62ns 1165.5±24.37ns +1.11%
OptimalMerkleTree::set 1032.2±10.13ns 1004.5±8.51ns -2.68%
poseidon Fr/Array hash/10 140.1±2.35µs 69.7 KElem/sec N/A N/A
poseidon Fr/Array hash/100 1503.0±1.86µs 65.0 KElem/sec N/A N/A
poseidon Fr/Array hash/1000 15.2±0.26ms 64.2 KElem/sec N/A N/A
poseidon Fr/Single hash 13.8±0.02µs 68.9 MElem/sec N/A N/A

@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for ed52774

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 12.6±0.13ms 12.8±0.10ms +1.59%
OptimalMerkleTree::::full_height_gen 798.6±8.60µs 799.0±9.88µs +0.05%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 374.9±4.31ns 373.2±4.50ns -0.45%
Pmtree::get_empty_leaves_indices 8.7±0.07ns 8.7±0.08ns 0.00%
Pmtree::get_subtree_root 548.7±7.19ns 552.1±5.97ns +0.62%
Pmtree::override_range 223.9±3.46µs 228.6±7.80µs +2.10%
Pmtree::set 50.9±0.28µs 50.8±1.16µs -0.20%
Pmtree:delete 51.0±0.63µs 50.7±0.51µs -0.59%
Set/FullMerkleTree::::set/1 514.3±6.43µs 511.3±4.86µs -0.58%
Set/FullMerkleTree::::set/10 5.2±0.01ms 5.1±0.04ms -1.92%
Set/FullMerkleTree::::set/100 51.7±0.18ms 51.7±0.13ms 0.00%
Set/FullMerkleTree::::set_range/1 514.6±5.38µs 514.7±5.17µs +0.02%
Set/FullMerkleTree::::set_range/10 705.8±18.66µs 702.5±4.53µs -0.47%
Set/FullMerkleTree::::set_range/100 3.1±0.01ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 515.8±6.19µs 514.8±3.71µs -0.19%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.05ms 0.00%
Set/OptimalMerkleTree::::set/100 53.3±0.72ms 53.2±0.11ms -0.19%
Set/OptimalMerkleTree::::set_range/1 511.9±4.82µs 515.3±6.80µs +0.66%
Set/OptimalMerkleTree::::set_range/10 706.3±7.17µs 704.0±4.09µs -0.33%
Set/OptimalMerkleTree::::set_range/100 3.0±0.00ms 3.0±0.05ms 0.00%
zkey::zkey_from_raw 677.8±0.34ms 680.8±4.15ms +0.44%

@github-actions
Copy link

github-actions bot commented May 4, 2025

Benchmark for ed52774

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 11.9±0.09ms 11.7±0.05ms -1.68%
OptimalMerkleTree::::full_height_gen 792.8±3.44µs 779.5±5.28µs -1.68%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 373.3±6.16ns 377.6±4.19ns +1.15%
Pmtree::get_empty_leaves_indices 8.7±0.11ns 8.7±0.14ns 0.00%
Pmtree::get_subtree_root 535.0±8.72ns 528.6±5.08ns -1.20%
Pmtree::override_range 233.2±4.12µs 224.1±2.60µs -3.90%
Pmtree::set 49.9±0.28µs 50.5±1.64µs +1.20%
Pmtree:delete 50.0±0.40µs 50.0±0.41µs 0.00%
Set/FullMerkleTree::::set/1 513.6±2.68µs 514.2±2.60µs +0.12%
Set/FullMerkleTree::::set/10 5.1±0.01ms 5.2±0.01ms +1.96%
Set/FullMerkleTree::::set/100 51.7±0.13ms 51.7±0.11ms 0.00%
Set/FullMerkleTree::::set_range/1 510.8±3.72µs 514.0±2.99µs +0.63%
Set/FullMerkleTree::::set_range/10 702.9±4.26µs 703.1±4.08µs +0.03%
Set/FullMerkleTree::::set_range/100 3.1±0.01ms 3.1±0.00ms 0.00%
Set/OptimalMerkleTree::::set/1 514.9±4.45µs 516.0±3.61µs +0.21%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.08ms 0.00%
Set/OptimalMerkleTree::::set/100 53.0±0.12ms 53.2±0.22ms +0.38%
Set/OptimalMerkleTree::::set_range/1 514.9±4.94µs 515.9±4.95µs +0.19%
Set/OptimalMerkleTree::::set_range/10 704.9±5.38µs 706.7±11.42µs +0.26%
Set/OptimalMerkleTree::::set_range/100 3.0±0.01ms 3.0±0.01ms 0.00%
arkzkey::arkzkey_from_raw_uncompressed 5.8±0.02ms 5.8±0.09ms 0.00%
zkey::zkey_from_raw 681.2±0.76ms 683.4±3.62ms +0.32%

@Ben-PH Ben-PH force-pushed the poseidon_hash_benchie-bph branch from e64ad17 to b65433b Compare May 5, 2025 17:33
@github-actions
Copy link

github-actions bot commented May 5, 2025

Benchmark for e29672f

Click to view benchmark
Test Base PR %
FullMerkleTree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::delete 876.2±8.92ns 868.1±9.78ns -0.92%
FullMerkleTree::get 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::get_empty_leaves_indices 7.8±0.10ns 7.5±0.13ns -3.85%
FullMerkleTree::get_subtree_root 3.8±0.17ns 3.8±0.09ns 0.00%
FullMerkleTree::override_range 1387.7±10.29ns 1366.9±18.41ns -1.50%
FullMerkleTree::set 868.8±9.93ns 873.5±10.27ns +0.54%
OptimalMerkleTree::compute_root 1021.6±14.26ns 1004.0±12.59ns -1.72%
OptimalMerkleTree::delete 1032.0±6.94ns 1012.1±9.18ns -1.93%
OptimalMerkleTree::get 22.6±0.24ns 22.3±0.26ns -1.33%
OptimalMerkleTree::get_empty_leaves_indices 7.5±0.14ns 7.5±0.07ns 0.00%
OptimalMerkleTree::get_subtree_root 24.0±0.31ns 23.9±0.45ns -0.42%
OptimalMerkleTree::override_range 1181.5±8.56ns 1155.2±20.56ns -2.23%
OptimalMerkleTree::set 1017.9±10.08ns 1011.3±16.53ns -0.65%
poseidon Fr/Array hash/10 139.1±0.24µs 70.2 KElem/sec N/A N/A
poseidon Fr/Array hash/100 1501.3±1.76µs 65.0 KElem/sec N/A N/A
poseidon Fr/Array hash/1000 15.2±0.03ms 64.5 KElem/sec N/A N/A
poseidon Fr/Single hash 13.8±0.02µs 69.1 MElem/sec N/A N/A

@github-actions
Copy link

github-actions bot commented May 5, 2025

Benchmark for e29672f

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 12.0±0.16ms 13.0±0.26ms +8.33%
OptimalMerkleTree::::full_height_gen 801.5±22.44µs 797.2±7.69µs -0.54%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 379.6±6.11ns 369.9±5.15ns -2.56%
Pmtree::get_empty_leaves_indices 8.7±0.07ns 8.7±0.09ns 0.00%
Pmtree::get_subtree_root 532.7±6.80ns 544.2±5.71ns +2.16%
Pmtree::override_range 226.7±3.86µs 223.4±4.62µs -1.46%
Pmtree::set 50.8±0.33µs 50.2±0.30µs -1.18%
Pmtree:delete 50.7±0.46µs 50.8±2.39µs +0.20%
Set/FullMerkleTree::::set/1 515.1±6.87µs 514.3±5.04µs -0.16%
Set/FullMerkleTree::::set/10 5.2±0.00ms 5.2±0.09ms 0.00%
Set/FullMerkleTree::::set/100 51.8±0.17ms 51.8±0.58ms 0.00%
Set/FullMerkleTree::::set_range/1 515.5±10.26µs 513.3±3.76µs -0.43%
Set/FullMerkleTree::::set_range/10 704.2±7.83µs 706.2±2.88µs +0.28%
Set/FullMerkleTree::::set_range/100 3.1±0.01ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 514.7±5.19µs 516.8±4.44µs +0.41%
Set/OptimalMerkleTree::::set/10 5.3±0.03ms 5.3±0.02ms 0.00%
Set/OptimalMerkleTree::::set/100 53.3±0.31ms 53.3±0.41ms 0.00%
Set/OptimalMerkleTree::::set_range/1 515.6±5.01µs 530.6±52.10µs +2.91%
Set/OptimalMerkleTree::::set_range/10 705.4±4.70µs 709.3±14.71µs +0.55%
Set/OptimalMerkleTree::::set_range/100 3.0±0.01ms 3.0±0.01ms 0.00%
zkey::zkey_from_raw 679.5±3.84ms 677.8±0.21ms -0.25%

@github-actions
Copy link

github-actions bot commented May 5, 2025

Benchmark for e29672f

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 12.6±0.10ms 11.8±0.07ms -6.35%
OptimalMerkleTree::::full_height_gen 779.4±6.73µs 783.4±4.79µs +0.51%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 378.7±4.11ns 393.0±8.32ns +3.78%
Pmtree::get_empty_leaves_indices 8.7±0.09ns 9.1±0.35ns +4.60%
Pmtree::get_subtree_root 539.2±8.67ns 532.0±4.74ns -1.34%
Pmtree::override_range 227.3±5.22µs 221.2±3.85µs -2.68%
Pmtree::set 50.1±0.62µs 51.4±3.03µs +2.59%
Pmtree:delete 50.2±0.50µs 50.9±0.65µs +1.39%
Set/FullMerkleTree::::set/1 513.9±2.64µs 520.4±4.51µs +1.26%
Set/FullMerkleTree::::set/10 5.2±0.01ms 5.2±0.02ms 0.00%
Set/FullMerkleTree::::set/100 51.8±0.38ms 52.4±2.51ms +1.16%
Set/FullMerkleTree::::set_range/1 510.5±3.27µs 519.1±5.55µs +1.68%
Set/FullMerkleTree::::set_range/10 704.4±5.52µs 709.2±2.61µs +0.68%
Set/FullMerkleTree::::set_range/100 3.1±0.00ms 3.1±0.00ms 0.00%
Set/OptimalMerkleTree::::set/1 517.4±16.44µs 519.4±4.41µs +0.39%
Set/OptimalMerkleTree::::set/10 5.3±0.02ms 5.4±0.01ms +1.89%
Set/OptimalMerkleTree::::set/100 53.2±0.12ms 53.5±0.10ms +0.56%
Set/OptimalMerkleTree::::set_range/1 512.7±14.67µs 520.5±5.45µs +1.52%
Set/OptimalMerkleTree::::set_range/10 705.2±3.18µs 713.3±11.04µs +1.15%
Set/OptimalMerkleTree::::set_range/100 3.0±0.01ms 3.0±0.01ms 0.00%
arkzkey::arkzkey_from_raw_uncompressed 5.8±0.00ms 5.8±0.00ms 0.00%
zkey::zkey_from_raw 682.5±1.13ms 682.0±2.14ms -0.07%

@github-actions
Copy link

github-actions bot commented May 6, 2025

Benchmark for bda3c5a

Click to view benchmark
Test Base PR %
FullMerkleTree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::delete 874.3±7.69ns 877.2±8.88ns +0.33%
FullMerkleTree::get 0.0±0.00ns 0.0±0.00ns NaN%
FullMerkleTree::get_empty_leaves_indices 7.8±0.17ns 7.5±0.14ns -3.85%
FullMerkleTree::get_subtree_root 10.3±0.01ns 3.5±0.13ns -66.02%
FullMerkleTree::override_range 1361.9±24.62ns 1363.3±42.08ns +0.10%
FullMerkleTree::set 867.1±9.62ns 869.9±8.01ns +0.32%
OptimalMerkleTree::compute_root 1012.2±14.72ns 1003.4±11.14ns -0.87%
OptimalMerkleTree::delete 1008.8±11.75ns 1012.7±27.15ns +0.39%
OptimalMerkleTree::get 30.4±0.22ns 22.1±0.26ns -27.30%
OptimalMerkleTree::get_empty_leaves_indices 7.5±0.06ns 7.5±0.10ns 0.00%
OptimalMerkleTree::get_subtree_root 31.9±0.57ns 23.7±0.32ns -25.71%
OptimalMerkleTree::override_range 1159.4±27.24ns 1157.0±35.42ns -0.21%
OptimalMerkleTree::set 1012.1±12.84ns 1005.7±18.76ns -0.63%
poseidon Fr/Array hash ift/10 141.6±0.70µs 68.9 KElem/sec N/A N/A
poseidon Fr/Array hash ift/100 1512.4±3.85µs 64.6 KElem/sec N/A N/A
poseidon Fr/Array hash ift/1000 15.2±0.01ms 64.2 KElem/sec N/A N/A
poseidon Fr/Array hash light/10 213.9±0.89µs 45.7 KElem/sec N/A N/A
poseidon Fr/Array hash light/100 2.2±0.00ms 45.3 KElem/sec N/A N/A
poseidon Fr/Array hash light/1000 21.6±0.04ms 45.3 KElem/sec N/A N/A
poseidon Fr/Array hash light_circom/10 214.6±1.07µs 45.5 KElem/sec N/A N/A
poseidon Fr/Array hash light_circom/100 2.2±0.00ms 45.3 KElem/sec N/A N/A
poseidon Fr/Array hash light_circom/1000 21.6±0.05ms 45.2 KElem/sec N/A N/A
poseidon Fr/Array hash/10 140.1±0.21µs 69.7 KElem/sec N/A N/A
poseidon Fr/Array hash/100 1511.6±3.82µs 64.6 KElem/sec N/A N/A
poseidon Fr/Array hash/1000 15.3±0.25ms 63.8 KElem/sec N/A N/A
poseidon Fr/Single hash 13.9±0.19µs 68.8 MElem/sec N/A N/A

@github-actions
Copy link

github-actions bot commented May 6, 2025

Benchmark for bda3c5a

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 13.5±0.31ms 12.4±0.43ms -8.15%
OptimalMerkleTree::::full_height_gen 783.0±9.65µs 778.8±7.27µs -0.54%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 371.4±4.57ns 374.7±4.77ns +0.89%
Pmtree::get_empty_leaves_indices 8.7±0.07ns 8.7±0.08ns 0.00%
Pmtree::get_subtree_root 536.6±7.32ns 530.3±7.40ns -1.17%
Pmtree::override_range 229.7±2.97µs 226.5±5.43µs -1.39%
Pmtree::set 50.7±0.95µs 50.3±0.55µs -0.79%
Pmtree:delete 50.7±0.31µs 50.4±0.86µs -0.59%
Set/FullMerkleTree::::set/1 514.2±4.16µs 515.7±4.54µs +0.29%
Set/FullMerkleTree::::set/10 5.2±0.02ms 5.2±0.01ms 0.00%
Set/FullMerkleTree::::set/100 51.7±0.08ms 51.9±0.29ms +0.39%
Set/FullMerkleTree::::set_range/1 513.7±2.53µs 516.2±4.36µs +0.49%
Set/FullMerkleTree::::set_range/10 703.5±3.19µs 707.6±9.64µs +0.58%
Set/FullMerkleTree::::set_range/100 3.1±0.01ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 515.1±4.62µs 517.8±7.14µs +0.52%
Set/OptimalMerkleTree::::set/10 5.3±0.03ms 5.3±0.01ms 0.00%
Set/OptimalMerkleTree::::set/100 53.0±0.13ms 53.6±1.15ms +1.13%
Set/OptimalMerkleTree::::set_range/1 516.0±6.57µs 517.1±3.32µs +0.21%
Set/OptimalMerkleTree::::set_range/10 705.5±4.49µs 707.1±2.38µs +0.23%
Set/OptimalMerkleTree::::set_range/100 3.0±0.01ms 3.0±0.01ms 0.00%
zkey::zkey_from_raw 681.8±9.11ms 685.7±10.01ms +0.57%

@github-actions
Copy link

github-actions bot commented May 6, 2025

Benchmark for bda3c5a

Click to view benchmark
Test Base PR %
FullMerkleTree::::full_height_gen 13.1±0.10ms 12.3±0.10ms -6.11%
OptimalMerkleTree::::full_height_gen 780.8±5.37µs 787.8±8.40µs +0.90%
Pmtree::compute_root 0.0±0.00ns 0.0±0.00ns NaN%
Pmtree::get 385.2±11.12ns 382.3±5.20ns -0.75%
Pmtree::get_empty_leaves_indices 8.7±0.06ns 9.0±0.14ns +3.45%
Pmtree::get_subtree_root 545.1±6.64ns 539.9±7.66ns -0.95%
Pmtree::override_range 226.0±3.29µs 226.0±6.06µs 0.00%
Pmtree::set 50.1±0.85µs 51.1±1.67µs +2.00%
Pmtree:delete 50.2±1.26µs 50.8±0.34µs +1.20%
Set/FullMerkleTree::::set/1 514.1±4.69µs 518.4±4.80µs +0.84%
Set/FullMerkleTree::::set/10 5.2±0.03ms 5.3±0.08ms +1.92%
Set/FullMerkleTree::::set/100 51.7±0.23ms 52.0±0.10ms +0.58%
Set/FullMerkleTree::::set_range/1 513.8±4.90µs 518.0±2.08µs +0.82%
Set/FullMerkleTree::::set_range/10 704.0±5.66µs 709.6±6.28µs +0.80%
Set/FullMerkleTree::::set_range/100 3.1±0.02ms 3.1±0.01ms 0.00%
Set/OptimalMerkleTree::::set/1 514.9±4.67µs 519.7±4.03µs +0.93%
Set/OptimalMerkleTree::::set/10 5.3±0.01ms 5.3±0.02ms 0.00%
Set/OptimalMerkleTree::::set/100 53.3±0.80ms 53.7±0.08ms +0.75%
Set/OptimalMerkleTree::::set_range/1 516.1±3.75µs 521.7±7.04µs +1.09%
Set/OptimalMerkleTree::::set_range/10 704.3±5.08µs 711.6±3.45µs +1.04%
Set/OptimalMerkleTree::::set_range/100 3.0±0.01ms 3.0±0.01ms 0.00%
arkzkey::arkzkey_from_raw_uncompressed 5.8±0.01ms 5.7±0.01ms -1.72%
zkey::zkey_from_raw 682.9±4.60ms 684.1±6.72ms +0.18%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants