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    },
  7    Felt,
  8};
  9use rand_utils::rand_value;
 10use winter_crypto::Hasher;
 11
 12fn rpo256_2to1(c: &mut Criterion) {
 13    let v: [RpoDigest; 2] = [Rpo256::hash(&[1_u8]), Rpo256::hash(&[2_u8])];
 14    c.bench_function("RPO256 2-to-1 hashing (cached)", |bench| {
 15        bench.iter(|| Rpo256::merge(black_box(&v)))
 16    });
 17
 18    c.bench_function("RPO256 2-to-1 hashing (random)", |bench| {
 19        bench.iter_batched(
 20            || {
 21                [
 22                    Rpo256::hash(&rand_value::<u64>().to_le_bytes()),
 23                    Rpo256::hash(&rand_value::<u64>().to_le_bytes()),
 24                ]
 25            },
 26            |state| Rpo256::merge(&state),
 27            BatchSize::SmallInput,
 28        )
 29    });
 30}
 31
 32fn rpo256_sequential(c: &mut Criterion) {
 33    let v: [Felt; 100] = (0..100)
 34        .into_iter()
 35        .map(Felt::new)
 36        .collect::<Vec<Felt>>()
 37        .try_into()
 38        .expect("should not fail");
 39    c.bench_function("RPO256 sequential hashing (cached)", |bench| {
 40        bench.iter(|| Rpo256::hash_elements(black_box(&v)))
 41    });
 42
 43    c.bench_function("RPO256 sequential hashing (random)", |bench| {
 44        bench.iter_batched(
 45            || {
 46                let v: [Felt; 100] = (0..100)
 47                    .into_iter()
 48                    .map(|_| Felt::new(rand_value()))
 49                    .collect::<Vec<Felt>>()
 50                    .try_into()
 51                    .expect("should not fail");
 52                v
 53            },
 54            |state| Rpo256::hash_elements(&state),
 55            BatchSize::SmallInput,
 56        )
 57    });
 58}
 59
 60fn blake3_2to1(c: &mut Criterion) {
 61    let v: [<Blake3_256 as Hasher>::Digest; 2] =
 62        [Blake3_256::hash(&[1_u8]), Blake3_256::hash(&[2_u8])];
 63    c.bench_function("Blake3 2-to-1 hashing (cached)", |bench| {
 64        bench.iter(|| Blake3_256::merge(black_box(&v)))
 65    });
 66
 67    c.bench_function("Blake3 2-to-1 hashing (random)", |bench| {
 68        bench.iter_batched(
 69            || {
 70                [
 71                    Blake3_256::hash(&rand_value::<u64>().to_le_bytes()),
 72                    Blake3_256::hash(&rand_value::<u64>().to_le_bytes()),
 73                ]
 74            },
 75            |state| Blake3_256::merge(&state),
 76            BatchSize::SmallInput,
 77        )
 78    });
 79}
 80
 81fn blake3_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("Blake3 sequential hashing (cached)", |bench| {
 89        bench.iter(|| Blake3_256::hash_elements(black_box(&v)))
 90    });
 91
 92    c.bench_function("Blake3 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| Blake3_256::hash_elements(&state),
104            BatchSize::SmallInput,
105        )
106    });
107}
108
109criterion_group!(
110    hash_group,
111    rpo256_2to1,
112    rpo256_sequential,
113    blake3_2to1,
114    blake3_sequential
115);
116criterion_main!(hash_group);