From c5f9ea91360cbb4a6f421ff7821b9bf871f42b86 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Tue, 23 Jul 2019 11:29:12 +0200 Subject: [PATCH] Fix benchmarks --- Cargo.toml | 26 +++++---- benches/lib.rs | 128 ------------------------------------------- benches/proof.rs | 138 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 138 deletions(-) delete mode 100644 benches/lib.rs create mode 100644 benches/proof.rs diff --git a/Cargo.toml b/Cargo.toml index 91823d3..70724d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,20 @@ readme = "README.md" keywords = ["merkle", "merkle-tree"] categories = ["data-structures", "cryptography"] +[package.metadata.release] +sign-commit = true +upload-doc = true +doc-branch = "gh-pages" +pre-release-commit-message = "Release version {{version}}." +pro-release-commit-message = "Start next development iteration {{version}}." +tag-message = "Release version {{version}}." +doc-commit-message = "Update documentation." +dev-version-ext = "pre" + +[[bench]] +name = "proof" +harness = false + [dependencies] ring = "^0.16.1" protobuf = { version = "^2.8.0", optional = true } @@ -27,18 +41,10 @@ protoc-rust = { version = "^2.8.0", optional = true } [dev-dependencies] serde_json = "1.0.40" +criterion = "0.2.11" +rand = "0.7.0" [features] serialization-protobuf = [ "protobuf", "protoc-rust" ] serialization-serde = [ "serde", "serde_derive" ] -[package.metadata.release] -sign-commit = true -upload-doc = true -doc-branch = "gh-pages" -pre-release-commit-message = "Release version {{version}}." -pro-release-commit-message = "Start next development iteration {{version}}." -tag-message = "Release version {{version}}." -doc-commit-message = "Update documentation." -dev-version-ext = "pre" - diff --git a/benches/lib.rs b/benches/lib.rs deleted file mode 100644 index 74e9568..0000000 --- a/benches/lib.rs +++ /dev/null @@ -1,128 +0,0 @@ -// #![feature(test)] -// #![feature(rand)] - -// extern crate rand; -// extern crate test; - -// extern crate merkle; -// extern crate ring; - -// use rand::Rng; -// use test::Bencher; - -// use ring::digest::{Algorithm, SHA512}; - -// use merkle::MerkleTree; - -// #[allow(non_upper_case_globals)] -// static digest: &'static Algorithm = &SHA512; - -// #[bench] -// fn bench_small_str_tree(b: &mut Bencher) { -// let values = vec!["one", "two", "three", "four"]; - -// b.iter(|| MerkleTree::from_vec(digest, values.clone())); -// } - -// #[bench] -// fn bench_small_str_proof_gen(b: &mut Bencher) { -// let values = vec!["one", "two", "three", "four"]; -// let tree = MerkleTree::from_vec(digest, values.clone()); - -// b.iter(|| { -// for value in &values { -// let proof = tree.gen_proof(value); -// test::black_box(proof); -// } -// }); -// } - -// #[bench] -// fn bench_small_str_proof_check(b: &mut Bencher) { -// let values = vec!["one", "two", "three", "four"]; -// let tree = MerkleTree::from_vec(digest, values.clone()); -// let proofs = values -// .iter() -// .map(|v| tree.gen_proof(v).unwrap()) -// .collect::>(); - -// b.iter(|| { -// for proof in &proofs { -// test::black_box(proof.validate(tree.root_hash())); -// } -// }); -// } - -// #[bench] -// fn bench_big_rnd_tree(b: &mut Bencher) { -// let mut values = vec![vec![0u8; 256]; 160]; -// let mut rng = rand::IsaacRng::new_unseeded(); - -// for mut v in &mut values { -// rng.fill_bytes(&mut v); -// } - -// b.iter(|| { -// let tree = MerkleTree::from_vec(digest, values.clone()); -// test::black_box(tree) -// }); -// } - -// #[bench] -// fn bench_big_rnd_proof_gen(b: &mut Bencher) { -// let mut values = vec![vec![0u8; 256]; 160]; -// let mut rng = rand::IsaacRng::new_unseeded(); - -// for mut v in &mut values { -// rng.fill_bytes(&mut v); -// } - -// let tree = MerkleTree::from_vec(digest, values.clone()); - -// b.iter(|| { -// for value in &values { -// let proof = tree.gen_proof(value.clone()); -// test::black_box(proof); -// } -// }); -// } - -// #[bench] -// fn bench_big_rnd_proof_check(b: &mut Bencher) { -// let mut values = vec![vec![0u8; 256]; 160]; -// let mut rng = rand::IsaacRng::new_unseeded(); - -// for mut v in &mut values { -// rng.fill_bytes(&mut v); -// } - -// let tree = MerkleTree::from_vec(digest, values.clone()); -// let proofs = values -// .into_iter() -// .map(|v| tree.gen_proof(v).unwrap()) -// .collect::>(); - -// b.iter(|| { -// for proof in &proofs { -// test::black_box(proof.validate(tree.root_hash())); -// } -// }); -// } - -// #[bench] -// fn bench_big_rnd_iter(b: &mut Bencher) { -// let mut values = vec![vec![0u8; 256]; 160]; -// let mut rng = rand::IsaacRng::new_unseeded(); - -// for mut v in &mut values { -// rng.fill_bytes(&mut v); -// } - -// let tree = MerkleTree::from_vec(digest, values.clone()); - -// b.iter(|| { -// for value in &tree { -// test::black_box(value); -// } -// }); -// } diff --git a/benches/proof.rs b/benches/proof.rs new file mode 100644 index 0000000..d18e089 --- /dev/null +++ b/benches/proof.rs @@ -0,0 +1,138 @@ +#[macro_use] +extern crate criterion; + +use criterion::black_box; +use criterion::Criterion; + +extern crate merkle; +extern crate rand; +extern crate ring; + +use merkle::MerkleTree; +use rand::RngCore; +use ring::digest::{Algorithm, SHA512}; + +static DIGEST: &'static Algorithm = &SHA512; + +fn bench_small_str_tree(c: &mut Criterion) { + c.bench_function("MerkleTree::from_bec - small", |b| { + let values = vec!["one", "two", "three", "four"]; + b.iter(|| MerkleTree::from_vec(DIGEST, black_box(values.clone()))) + }); +} + +fn bench_small_str_proof_gen(c: &mut Criterion) { + c.bench_function("MerkleTree::gen_proof - small", |b| { + let values = vec!["one", "two", "three", "four"]; + let tree = MerkleTree::from_vec(DIGEST, values.clone()); + + b.iter(|| { + for value in &values { + tree.gen_proof(black_box(value)); + } + }) + }); +} + +fn bench_small_str_proof_check(c: &mut Criterion) { + c.bench_function("MerkleTree::validate_proof - small", |b| { + let values = vec!["one", "two", "three", "four"]; + let tree = MerkleTree::from_vec(DIGEST, values.clone()); + let proofs = values + .iter() + .map(|v| tree.gen_proof(v).unwrap()) + .collect::>(); + + b.iter(|| { + for proof in &proofs { + proof.validate(black_box(tree.root_hash())); + } + }) + }); +} + +fn bench_big_rnd_tree(c: &mut Criterion) { + c.bench_function("MerkleTree::from_vec - big", |b| { + let mut values = vec![vec![0u8; 256]; 160]; + let mut rng = rand::thread_rng(); + + for mut v in &mut values { + rng.fill_bytes(&mut v); + } + + b.iter(|| MerkleTree::from_vec(DIGEST, black_box(values.clone()))) + }); +} + +fn bench_big_rnd_proof_gen(c: &mut Criterion) { + c.bench_function("MerkleTree::gen_proof - big", |b| { + let mut values = vec![vec![0u8; 256]; 160]; + let mut rng = rand::thread_rng(); + + for mut v in &mut values { + rng.fill_bytes(&mut v); + } + + let tree = MerkleTree::from_vec(DIGEST, values.clone()); + + b.iter(|| { + for value in &values { + tree.gen_proof(black_box(value.clone())); + } + }) + }); +} + +fn bench_big_rnd_proof_check(c: &mut Criterion) { + c.bench_function("MerkleTree::validate_proof - big", |b| { + let mut values = vec![vec![0u8; 256]; 160]; + let mut rng = rand::thread_rng(); + + for mut v in &mut values { + rng.fill_bytes(&mut v); + } + + let tree = MerkleTree::from_vec(DIGEST, values.clone()); + let proofs = values + .into_iter() + .map(|v| tree.gen_proof(v).unwrap()) + .collect::>(); + + b.iter(|| { + for proof in &proofs { + proof.validate(black_box(tree.root_hash())); + } + }) + }); +} + +fn bench_big_rnd_iter(c: &mut Criterion) { + c.bench_function("MerkleTree::iter - big", |b| { + let mut values = vec![vec![0u8; 256]; 160]; + let mut rng = rand::thread_rng(); + + for mut v in &mut values { + rng.fill_bytes(&mut v); + } + + let tree = MerkleTree::from_vec(DIGEST, values.clone()); + b.iter(|| { + for value in &tree { + black_box(value); + } + }) + }); +} + +criterion_group!( + benches, + bench_small_str_tree, + bench_small_str_proof_gen, + bench_small_str_proof_check, + bench_big_rnd_tree, + bench_big_rnd_proof_gen, + bench_big_rnd_proof_check, + bench_big_rnd_iter, +); + +criterion_main!(benches);