miden-crypto/benches/hash.rs
benches/hash.rsRaw
1
2
3use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion};
4use miden_crypto::{hash::{Hasher, Digest}, HashFn, Felt, ElementHasher};
5use rand_utils::rand_value;
6
7fn rpo256_2to1(c: &mut Criterion) {
8 let v: [Digest; 2] = [Hasher::hash(&[1u8]), Hasher::hash(&[2u8])];
9 c.bench_function("RPO256 2-to-1 hashing (cached)", |bench| {
10 bench.iter(|| Hasher::merge(black_box(&v)))
11 });
12
13 c.bench_function("RPO256 2-to-1 hashing (random)", |bench| {
14 bench.iter_batched(
15 || {
16 [
17 Hasher::hash(&rand_value::<u64>().to_le_bytes()),
18 Hasher::hash(&rand_value::<u64>().to_le_bytes()),
19 ]
20 },
21 |state| Hasher::merge(&state),
22 BatchSize::SmallInput,
23 )
24 });
25}
26
27fn rpo256_sequential(c: &mut Criterion) {
28 let v: [Felt; 100] = (0..100)
29 .into_iter()
30 .map(Felt::new)
31 .collect::<Vec<Felt>>()
32 .try_into()
33 .expect("should not fail");
34 c.bench_function("RPO256 sequential hashing (cached)", |bench| {
35 bench.iter(|| Hasher::hash_elements(black_box(&v)))
36 });
37
38 c.bench_function("RPO256 sequential hashing (random)", |bench| {
39 bench.iter_batched(
40 || {
41 let v: [Felt; 100] = (0..100)
42 .into_iter()
43 .map(|_| Felt::new(rand_value()))
44 .collect::<Vec<Felt>>()
45 .try_into()
46 .expect("should not fail");
47 v
48 },
49 |state| Hasher::hash_elements(&state),
50 BatchSize::SmallInput,
51 )
52 });
53}
54
55criterion_group!(hash_group, rpo256_sequential, rpo256_2to1);
56criterion_main!(hash_group);