summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart Stock <stuart@int08h.com>2018-12-25 18:55:45 -0600
committerStuart Stock <stuart@int08h.com>2018-12-25 18:55:45 -0600
commitf03a17fa0e894229634808376c4903c3342d8833 (patch)
treefbbb45df78eb343afac4f42505cee3c875e0e2b8
parent744632a329070902898c28b4b30f399b04146285 (diff)
downloadroughenough-f03a17fa0e894229634808376c4903c3342d8833.zip
add a simple criterion-based benchmark
-rw-r--r--Cargo.toml8
-rw-r--r--benches/roughenough-bench.rs97
2 files changed, 105 insertions, 0 deletions
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);