-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathbenchmarks.rs
112 lines (98 loc) · 3.61 KB
/
benchmarks.rs
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright 2020 Nym Technologies SA
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
extern crate sphinx_packet;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use sphinx_packet::constants::{
DESTINATION_ADDRESS_LENGTH, IDENTIFIER_LENGTH, NODE_ADDRESS_LENGTH,
};
use sphinx_packet::header::delays;
use sphinx_packet::route::{Destination, DestinationAddressBytes, Node, NodeAddressBytes};
use sphinx_packet::test_utils::fixtures::keygen;
use sphinx_packet::SphinxPacket;
use std::time::Duration;
fn make_packet_copy(packet: &SphinxPacket) -> SphinxPacket {
SphinxPacket::from_bytes(&packet.to_bytes()).unwrap()
}
// two of those can be run concurrently to perform credential verification
fn bench_new_no_surb(c: &mut Criterion) {
let (_, node1_pk) = keygen();
let node1 = Node::new(
NodeAddressBytes::from_bytes([5u8; NODE_ADDRESS_LENGTH]),
node1_pk,
);
let (_, node2_pk) = keygen();
let node2 = Node::new(
NodeAddressBytes::from_bytes([4u8; NODE_ADDRESS_LENGTH]),
node2_pk,
);
let (_, node3_pk) = keygen();
let node3 = Node::new(
NodeAddressBytes::from_bytes([2u8; NODE_ADDRESS_LENGTH]),
node3_pk,
);
let route = [node1, node2, node3];
let delays = delays::generate_from_average_duration(route.len(), Duration::from_millis(10));
let destination = Destination::new(
DestinationAddressBytes::from_bytes([3u8; DESTINATION_ADDRESS_LENGTH]),
[4u8; IDENTIFIER_LENGTH],
);
let message = vec![13u8, 16];
c.bench_function("sphinx creation", |b| {
b.iter(|| {
SphinxPacket::new(
black_box(message.clone()),
black_box(&route),
black_box(&destination),
black_box(&delays),
)
.unwrap()
})
});
}
fn bench_unwrap(c: &mut Criterion) {
let (node1_sk, node1_pk) = keygen();
let node1 = Node::new(
NodeAddressBytes::from_bytes([5u8; NODE_ADDRESS_LENGTH]),
node1_pk,
);
let (_, node2_pk) = keygen();
let node2 = Node::new(
NodeAddressBytes::from_bytes([4u8; NODE_ADDRESS_LENGTH]),
node2_pk,
);
let (_, node3_pk) = keygen();
let node3 = Node::new(
NodeAddressBytes::from_bytes([2u8; NODE_ADDRESS_LENGTH]),
node3_pk,
);
let route = [node1, node2, node3];
let delays = delays::generate_from_average_duration(route.len(), Duration::from_millis(10));
let destination = Destination::new(
DestinationAddressBytes::from_bytes([3u8; DESTINATION_ADDRESS_LENGTH]),
[4u8; IDENTIFIER_LENGTH],
);
let message = vec![13u8, 16];
let packet = SphinxPacket::new(message, &route, &destination, &delays).unwrap();
// technically it's not benching only unwrapping, but also "make_packet_copy"
// but it's relatively small
c.bench_function("sphinx unwrap", |b| {
b.iter(|| {
make_packet_copy(&packet)
.process(black_box(&node1_sk))
.unwrap()
})
});
}
criterion_group!(sphinx, bench_new_no_surb, bench_unwrap);
criterion_main!(sphinx);