arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
miden-crypto/benches/hash.rs
benches/hash.rsRaw
  1use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion};
  2use miden_crypto::{
  3    hash::{
  4        blake::Blake3_256,
  5        rpo::{Rpo256, RpoDigest},
  6        rpx::{Rpx256, RpxDigest},
  7    },
  8    Felt,
  9};
 10use rand_utils::rand_value;
 11use winter_crypto::Hasher;
 12
 13fn rpo256_2to1(c: &mut Criterion) {
 14    let v: [RpoDigest; 2] = [Rpo256::hash(&[1_u8]), Rpo256::hash(&[2_u8])];
 15    c.bench_function("RPO256 2-to-1 hashing (cached)", |bench| {
 16        bench.iter(|| Rpo256::merge(black_box(&v)))
 17    });
 18
 19    c.bench_function("RPO256 2-to-1 hashing (random)", |bench| {
 20        bench.iter_batched(
 21            || {
 22                [
 23                    Rpo256::hash(&rand_value::<u64>().to_le_bytes()),
 24                    Rpo256::hash(&rand_value::<u64>().to_le_bytes()),
 25                ]
 26            },
 27            |state| Rpo256::merge(&state),
 28            BatchSize::SmallInput,
 29        )
 30    });
 31}
 32
 33fn rpo256_sequential(c: &mut Criterion) {
 34    let v: [Felt; 100] = (0..100)
 35        .into_iter()
 36        .map(Felt::new)
 37        .collect::<Vec<Felt>>()
 38        .try_into()
 39        .expect("should not fail");
 40    c.bench_function("RPO256 sequential hashing (cached)", |bench| {
 41        bench.iter(|| Rpo256::hash_elements(black_box(&v)))
 42    });
 43
 44    c.bench_function("RPO256 sequential hashing (random)", |bench| {
 45        bench.iter_batched(
 46            || {
 47                let v: [Felt; 100] = (0..100)
 48                    .into_iter()
 49                    .map(|_| Felt::new(rand_value()))
 50                    .collect::<Vec<Felt>>()
 51                    .try_into()
 52                    .expect("should not fail");
 53                v
 54            },
 55            |state| Rpo256::hash_elements(&state),
 56            BatchSize::SmallInput,
 57        )
 58    });
 59}
 60
 61fn rpx256_2to1(c: &mut Criterion) {
 62    let v: [RpxDigest; 2] = [Rpx256::hash(&[1_u8]), Rpx256::hash(&[2_u8])];
 63    c.bench_function("RPX256 2-to-1 hashing (cached)", |bench| {
 64        bench.iter(|| Rpx256::merge(black_box(&v)))
 65    });
 66
 67    c.bench_function("RPX256 2-to-1 hashing (random)", |bench| {
 68        bench.iter_batched(
 69            || {
 70                [
 71                    Rpx256::hash(&rand_value::<u64>().to_le_bytes()),
 72                    Rpx256::hash(&rand_value::<u64>().to_le_bytes()),
 73                ]
 74            },
 75            |state| Rpx256::merge(&state),
 76            BatchSize::SmallInput,
 77        )
 78    });
 79}
 80
 81fn rpx256_sequential(c: &mut Criterion) {
 82    let v: [Felt; 100] = (0..100)
 83        .into_iter()
 84        .map(Felt::new)
 85        .collect::<Vec<Felt>>()
 86        .try_into()
 87        .expect("should not fail");
 88    c.bench_function("RPX256 sequential hashing (cached)", |bench| {
 89        bench.iter(|| Rpx256::hash_elements(black_box(&v)))
 90    });
 91
 92    c.bench_function("RPX256 sequential hashing (random)", |bench| {
 93        bench.iter_batched(
 94            || {
 95                let v: [Felt; 100] = (0..100)
 96                    .into_iter()
 97                    .map(|_| Felt::new(rand_value()))
 98                    .collect::<Vec<Felt>>()
 99                    .try_into()
100                    .expect("should not fail");
101                v
102            },
103            |state| Rpx256::hash_elements(&state),
104            BatchSize::SmallInput,
105        )
106    });
107}
108
109fn blake3_2to1(c: &mut Criterion) {
110    let v: [<Blake3_256 as Hasher>::Digest; 2] =
111        [Blake3_256::hash(&[1_u8]), Blake3_256::hash(&[2_u8])];
112    c.bench_function("Blake3 2-to-1 hashing (cached)", |bench| {
113        bench.iter(|| Blake3_256::merge(black_box(&v)))
114    });
115
116    c.bench_function("Blake3 2-to-1 hashing (random)", |bench| {
117        bench.iter_batched(
118            || {
119                [
120                    Blake3_256::hash(&rand_value::<u64>().to_le_bytes()),
121                    Blake3_256::hash(&rand_value::<u64>().to_le_bytes()),
122                ]
123            },
124            |state| Blake3_256::merge(&state),
125            BatchSize::SmallInput,
126        )
127    });
128}
129
130fn blake3_sequential(c: &mut Criterion) {
131    let v: [Felt; 100] = (0..100)
132        .into_iter()
133        .map(Felt::new)
134        .collect::<Vec<Felt>>()
135        .try_into()
136        .expect("should not fail");
137    c.bench_function("Blake3 sequential hashing (cached)", |bench| {
138        bench.iter(|| Blake3_256::hash_elements(black_box(&v)))
139    });
140
141    c.bench_function("Blake3 sequential hashing (random)", |bench| {
142        bench.iter_batched(
143            || {
144                let v: [Felt; 100] = (0..100)
145                    .into_iter()
146                    .map(|_| Felt::new(rand_value()))
147                    .collect::<Vec<Felt>>()
148                    .try_into()
149                    .expect("should not fail");
150                v
151            },
152            |state| Blake3_256::hash_elements(&state),
153            BatchSize::SmallInput,
154        )
155    });
156}
157
158criterion_group!(
159    hash_group,
160    rpx256_2to1,
161    rpx256_sequential,
162    rpo256_2to1,
163    rpo256_sequential,
164    blake3_2to1,
165    blake3_sequential
166);
167criterion_main!(hash_group);