1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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);
|