summaryrefslogtreecommitdiff
path: root/benches/roughenough-bench.rs
blob: 7b710f8dc01d90e2d05f513a20fe023970721c9e (plain)
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);