|
| 1 | +use commonware_coding::reed_solomon::{decode, encode}; |
| 2 | +use commonware_cryptography::Sha256; |
| 3 | +use criterion::{criterion_group, BatchSize, Criterion}; |
| 4 | +use rand::{rngs::StdRng, seq::SliceRandom, RngCore, SeedableRng}; |
| 5 | + |
| 6 | +fn benchmark_decode(c: &mut Criterion) { |
| 7 | + let mut sampler = StdRng::seed_from_u64(0); |
| 8 | + let cases = [8, 12, 16, 19, 20, 24].map(|i| 2usize.pow(i)); |
| 9 | + for data_length in cases.into_iter() { |
| 10 | + for chunks in [10, 25, 50, 100, 250] { |
| 11 | + let min = chunks / 3; |
| 12 | + c.bench_function( |
| 13 | + &format!( |
| 14 | + "{}/msg_len={} chunks={}", |
| 15 | + module_path!(), |
| 16 | + data_length, |
| 17 | + chunks |
| 18 | + ), |
| 19 | + |b| { |
| 20 | + b.iter_batched( |
| 21 | + || { |
| 22 | + // Generate random data |
| 23 | + let mut data = vec![0u8; data_length]; |
| 24 | + sampler.fill_bytes(&mut data); |
| 25 | + |
| 26 | + // Encode data |
| 27 | + let (root, proofs) = encode::<Sha256>(chunks, min, data).unwrap(); |
| 28 | + |
| 29 | + // Select min random chunks |
| 30 | + let mut shuffled = Vec::with_capacity(min as usize); |
| 31 | + let mut indices: Vec<u16> = (0..chunks).collect(); |
| 32 | + indices.shuffle(&mut sampler); |
| 33 | + for &i in indices.iter().take(min as usize) { |
| 34 | + shuffled.push(proofs[i as usize].clone()); |
| 35 | + } |
| 36 | + |
| 37 | + (root, shuffled) |
| 38 | + }, |
| 39 | + |(root, shuffled)| { |
| 40 | + decode::<Sha256>(chunks, min, &root, shuffled).unwrap(); |
| 41 | + }, |
| 42 | + BatchSize::SmallInput, |
| 43 | + ); |
| 44 | + }, |
| 45 | + ); |
| 46 | + } |
| 47 | + } |
| 48 | +} |
| 49 | + |
| 50 | +criterion_group! { |
| 51 | + name = benches; |
| 52 | + config = Criterion::default().sample_size(10); |
| 53 | + targets = benchmark_decode |
| 54 | +} |
0 commit comments