X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=lightning%2Fsrc%2Frouting%2Frouter.rs;h=47a261786c370f8dbd9ae3904005b72b28a44e2a;hb=1a8b9be5e432fe43b778292f530a8a09062999c8;hp=dd18f1bc716af92748e500469a1edb3344a0451a;hpb=e0600e5b1edc5be57258a4b28963789dbc69b431;p=rust-lightning diff --git a/lightning/src/routing/router.rs b/lightning/src/routing/router.rs index dd18f1bc..47a26178 100644 --- a/lightning/src/routing/router.rs +++ b/lightning/src/routing/router.rs @@ -47,6 +47,7 @@ pub struct RouteHop { pub cltv_expiry_delta: u32, } +/// (C-not exported) impl Writeable for Vec { fn write(&self, writer: &mut W) -> Result<(), ::std::io::Error> { (self.len() as u8).write(writer)?; @@ -62,6 +63,7 @@ impl Writeable for Vec { } } +/// (C-not exported) impl Readable for Vec { fn read(reader: &mut R) -> Result, DecodeError> { let hops_count: u8 = Readable::read(reader)?; @@ -944,7 +946,7 @@ pub fn get_route(our_node_id: &PublicKey, network: &NetworkGraph, paye // TODO: this could also be optimized by also sorting by feerate_per_sat_routed, // so that the sender pays less fees overall. And also htlc_minimum_msat. cur_route.sort_by_key(|path| { path.hops.iter().map(|hop| hop.channel_fees.proportional_millionths as u64).sum::() }); - let mut expensive_payment_path = cur_route.first_mut().unwrap(); + let expensive_payment_path = cur_route.first_mut().unwrap(); // We already dropped all the small channels above, meaning all the // remaining channels are larger than remaining overpaid_value_msat. // Thus, this can't be negative. @@ -959,7 +961,7 @@ pub fn get_route(our_node_id: &PublicKey, network: &NetworkGraph, paye // Step (8). // Select the best route by lowest total fee. drawn_routes.sort_by_key(|paths| paths.iter().map(|path| path.get_total_fee_paid_msat()).sum::()); - let mut selected_paths = Vec::>::new(); + let mut selected_paths = vec![]; for payment_path in drawn_routes.first().unwrap() { selected_paths.push(payment_path.hops.iter().map(|payment_hop| payment_hop.route_hop.clone()).collect()); } @@ -3336,3 +3338,48 @@ mod tests { } } + +#[cfg(all(test, feature = "unstable"))] +mod benches { + use super::*; + use util::logger::{Logger, Record}; + + use std::fs::File; + use test::Bencher; + + struct DummyLogger {} + impl Logger for DummyLogger { + fn log(&self, _record: &Record) {} + } + + #[bench] + fn generate_routes(bench: &mut Bencher) { + let mut d = File::open("net_graph-2021-02-12.bin").expect("Please fetch https://bitcoin.ninja/ldk-net_graph-879e309c128-2020-02-12.bin and place it at lightning/net_graph-2021-02-12.bin"); + let graph = NetworkGraph::read(&mut d).unwrap(); + + // First, get 100 (source, destination) pairs for which route-getting actually succeeds... + let mut path_endpoints = Vec::new(); + let mut seed: usize = 0xdeadbeef; + 'load_endpoints: for _ in 0..100 { + loop { + seed *= 0xdeadbeef; + let src = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap(); + seed *= 0xdeadbeef; + let dst = graph.get_nodes().keys().skip(seed % graph.get_nodes().len()).next().unwrap(); + let amt = seed as u64 % 1_000_000; + if get_route(src, &graph, dst, None, &[], amt, 42, &DummyLogger{}).is_ok() { + path_endpoints.push((src, dst, amt)); + continue 'load_endpoints; + } + } + } + + // ...then benchmark finding paths between the nodes we learned. + let mut idx = 0; + bench.iter(|| { + let (src, dst, amt) = path_endpoints[idx % path_endpoints.len()]; + assert!(get_route(src, &graph, dst, None, &[], amt, 42, &DummyLogger{}).is_ok()); + idx += 1; + }); + } +}