#![feature(test)] extern crate test; use { rand::{prelude::*, Rng}, reed_solomon_erasure::galois_8::Field, test::Bencher, }; type ReedSolomon = reed_solomon_erasure::ReedSolomon; const SHARD_SIZE: usize = 1024; fn run_reconstruct_bench(bencher: &mut Bencher, num_data_shards: usize, num_parity_shards: usize) { let mut rng = rand::thread_rng(); let mut shards = vec![vec![0u8; SHARD_SIZE]; num_data_shards + num_parity_shards]; for shard in &mut shards[..num_data_shards] { rng.fill(&mut shard[..]); } let reed_solomon = ReedSolomon::new(num_data_shards, num_parity_shards).unwrap(); reed_solomon.encode(&mut shards[..]).unwrap(); let shards: Vec<_> = shards.into_iter().map(Some).collect(); bencher.iter(|| { let mut shards = shards.clone(); for _ in 0..num_parity_shards { *shards.choose_mut(&mut rng).unwrap() = None; } reed_solomon.reconstruct(&mut shards[..]).unwrap(); assert!(shards.iter().all(Option::is_some)); }); } #[bench] fn bench_reconstruct_2_2(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 2, 2) } #[bench] fn bench_reconstruct_4_2(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 4, 2) } #[bench] fn bench_reconstruct_4_4(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 4, 4) } #[bench] fn bench_reconstruct_8_2(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 8, 2) } #[bench] fn bench_reconstruct_8_4(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 8, 4) } #[bench] fn bench_reconstruct_8_8(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 8, 8) } #[bench] fn bench_reconstruct_16_2(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 16, 2) } #[bench] fn bench_reconstruct_16_4(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 16, 4) } #[bench] fn bench_reconstruct_16_8(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 16, 8) } #[bench] fn bench_reconstruct_16_16(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 16, 16) } #[bench] fn bench_reconstruct_32_2(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 32, 2) } #[bench] fn bench_reconstruct_32_4(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 32, 4) } #[bench] fn bench_reconstruct_32_8(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 32, 8) } #[bench] fn bench_reconstruct_32_16(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 32, 16) } #[bench] fn bench_reconstruct_32_32(bencher: &mut Bencher) { run_reconstruct_bench(bencher, 32, 32) }