Skip to content

Commit c7d4502

Browse files
Benchmark onion message pathfinding
1 parent 2e3763f commit c7d4502

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

lightning/src/routing/onion_message.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,71 @@ mod tests {
183183
assert_eq!(path.len(), 19);
184184
}
185185
}
186+
187+
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
188+
mod benches {
189+
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
190+
use routing::gossip::NetworkGraph;
191+
use routing::router::test_utils;
192+
use super::find_path;
193+
use test::Bencher;
194+
use util::logger::{Logger, Record};
195+
use util::ser::ReadableArgs;
196+
197+
struct DummyLogger {}
198+
impl Logger for DummyLogger {
199+
fn log(&self, _record: &Record) {}
200+
}
201+
202+
fn read_network_graph(logger: &DummyLogger) -> NetworkGraph<&DummyLogger> {
203+
let mut d = test_utils::get_route_file().unwrap();
204+
NetworkGraph::read(&mut d, logger).unwrap()
205+
}
206+
207+
#[bench]
208+
fn generate_simple_routes(bench: &mut Bencher) {
209+
let logger = DummyLogger {};
210+
let network_graph = read_network_graph(&logger);
211+
generate_routes(bench, &network_graph);
212+
}
213+
214+
fn payer_pubkey() -> PublicKey {
215+
let secp_ctx = Secp256k1::new();
216+
PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
217+
}
218+
219+
fn generate_routes(
220+
bench: &mut Bencher, graph: &NetworkGraph<&DummyLogger>,
221+
) {
222+
let nodes = graph.read_only().nodes().clone();
223+
let payer = payer_pubkey();
224+
225+
// Get 100 (source, destination) pairs for which route-getting actually succeeds...
226+
let mut routes = Vec::new();
227+
let mut route_endpoints = Vec::new();
228+
let mut seed: usize = 0xdeadbeef;
229+
'load_endpoints: for _ in 0..150 {
230+
loop {
231+
seed *= 0xdeadbeef;
232+
let first_hop = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
233+
seed *= 0xdeadbeef;
234+
let dst = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
235+
if let Ok(route) = find_path(&payer, &dst, &graph, Some(&[&first_hop]), &DummyLogger{}) {
236+
routes.push(route);
237+
route_endpoints.push((first_hop, dst));
238+
continue 'load_endpoints;
239+
}
240+
}
241+
}
242+
route_endpoints.truncate(100);
243+
assert_eq!(route_endpoints.len(), 100);
244+
245+
// Benchmark finding paths between the nodes we learned.
246+
let mut idx = 0;
247+
bench.iter(|| {
248+
let (first_hop, dst) = &route_endpoints[idx % route_endpoints.len()];
249+
assert!(find_path(&payer, &dst, &graph, Some(&[first_hop]), &DummyLogger{}).is_ok());
250+
idx += 1;
251+
});
252+
}
253+
}

0 commit comments

Comments
 (0)