From f03a17fa0e894229634808376c4903c3342d8833 Mon Sep 17 00:00:00 2001 From: Stuart Stock Date: Tue, 25 Dec 2018 18:55:45 -0600 Subject: add a simple criterion-based benchmark --- Cargo.toml | 8 ++++ benches/roughenough-bench.rs | 97 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 benches/roughenough-bench.rs diff --git a/Cargo.toml b/Cargo.toml index 8b7d652..ec1015c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,3 +43,11 @@ hyper-rustls = { version = "^0.6", optional = true } serde = { version = "^1.0", optional = true } serde_json = { version = "^1.0", optional = true } yup-oauth2 = { version = "^1.0", optional = true } + + +[dev-dependencies] +criterion = "0.2" + +[[bench]] +name = "roughenough-bench" +harness = false diff --git a/benches/roughenough-bench.rs b/benches/roughenough-bench.rs new file mode 100644 index 0000000..7b710f8 --- /dev/null +++ b/benches/roughenough-bench.rs @@ -0,0 +1,97 @@ +#[macro_use] +extern crate criterion; +extern crate roughenough; + +use criterion::{black_box, Criterion}; +use roughenough::RtMessage; +use roughenough::Tag; +use roughenough::merkle::{MerkleTree, root_from_paths}; + +fn create_empty_message(c: &mut Criterion) { + c.bench_function("create empty message", |b| b.iter(|| RtMessage::new(0))); +} + +fn create_single_field_message(c: &mut Criterion) { + c.bench_function("create single field message", |b| b.iter(|| { + let mut msg = RtMessage::new(1); + msg.add_field(Tag::NONC, "1234".as_bytes()).unwrap(); + })); +} + +fn create_two_field_message(c: &mut Criterion) { + c.bench_function("create two field message", |b| b.iter(|| { + let mut msg = RtMessage::new(2); + msg.add_field(Tag::NONC, "1234".as_bytes()).unwrap(); + msg.add_field(Tag::PAD, "abcd".as_bytes()).unwrap(); + })); +} + +fn create_four_field_message(c: &mut Criterion) { + c.bench_function("create four field message", |b| b.iter(|| { + let mut msg = RtMessage::new(4); + msg.add_field(Tag::SIG, "0987".as_bytes()).unwrap(); + msg.add_field(Tag::NONC, "wxyz".as_bytes()).unwrap(); + msg.add_field(Tag::DELE, "1234".as_bytes()).unwrap(); + msg.add_field(Tag::PATH, "abcd".as_bytes()).unwrap(); + })); +} + +fn create_nested_message(c: &mut Criterion) { + let pad = [0u8; 400]; + + c.bench_function("create nested message", move |b| b.iter(|| { + let mut msg1 = RtMessage::new(4); + msg1.add_field(Tag::SIG, "0987".as_bytes()).unwrap(); + msg1.add_field(Tag::NONC, "wxyz".as_bytes()).unwrap(); + msg1.add_field(Tag::DELE, "1234".as_bytes()).unwrap(); + msg1.add_field(Tag::PATH, "abcd".as_bytes()).unwrap(); + + let mut msg2 = RtMessage::new(2); + msg2.add_field(Tag::PUBK, "1234567890".as_bytes()).unwrap(); + msg2.add_field(Tag::PAD, pad.as_ref()).unwrap(); + })); +} + +static SIZES: &[u8] = &[1, 3, 9, 17, 200]; +static DATA: &[u8] = &[1u8; 64]; + +fn create_new_merkle_tree(c: &mut Criterion) { + c.bench_function_over_inputs("create new merkle trees", move |b, &size| { + b.iter(|| { + let mut tree = MerkleTree::new(); + for _ in 0..*size { + tree.push_leaf(DATA); + } + black_box(tree.compute_root()) + }) + }, SIZES); +} + +fn reuse_merkle_trees(c: &mut Criterion) { + let mut tree = MerkleTree::new(); + + c.bench_function_over_inputs("reuse existing merkle tree", move |b, &size| { + b.iter(|| { + tree.reset(); + for _ in 0..*size { + tree.push_leaf(DATA); + } + black_box(tree.compute_root()); + }) + }, SIZES); +} + +criterion_group!(message_creation, + create_empty_message, + create_single_field_message, + create_two_field_message, + create_four_field_message, + create_nested_message +); + +criterion_group!(merkle_tree, + create_new_merkle_tree, + reuse_merkle_trees +); + +criterion_main!(message_creation, merkle_tree); -- cgit v1.2.3