Skip to content

Commit 640fc76

Browse files
committed
Add a benchmark for decaying a 100k channel scorer's liquidity info
This is a good gut-check to ensure we don't end up taking a ton of time decaying channel liquidity info. It currently clocks in around 1.25ms on an i7-1360P.
1 parent 0803fb3 commit 640fc76

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

bench/benches/bench.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ criterion_group!(benches,
2121
lightning_persister::fs_store::bench::bench_sends,
2222
lightning_rapid_gossip_sync::bench::bench_reading_full_graph_from_file,
2323
lightning::routing::gossip::benches::read_network_graph,
24-
lightning::routing::gossip::benches::write_network_graph);
24+
lightning::routing::gossip::benches::write_network_graph,
25+
lightning::routing::scoring::benches::decay_100k_channel_bounds);
2526
criterion_main!(benches);

lightning/src/routing/scoring.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3550,3 +3550,61 @@ mod tests {
35503550
Some(0.0));
35513551
}
35523552
}
3553+
3554+
#[cfg(ldk_bench)]
3555+
pub mod benches {
3556+
use super::*;
3557+
use criterion::Criterion;
3558+
use crate::routing::router::{bench_utils, RouteHop};
3559+
use crate::util::test_utils::TestLogger;
3560+
use crate::ln::features::{ChannelFeatures, NodeFeatures};
3561+
3562+
pub fn decay_100k_channel_bounds(bench: &mut Criterion) {
3563+
let logger = TestLogger::new();
3564+
let network_graph = bench_utils::read_network_graph(&logger).unwrap();
3565+
let mut scorer = ProbabilisticScorer::new(Default::default(), &network_graph, &logger);
3566+
// Score a number of random channels
3567+
let mut seed: u64 = 0xdeadbeef;
3568+
for _ in 0..100_000 {
3569+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3570+
let (victim, victim_dst, amt) = {
3571+
let rong = network_graph.read_only();
3572+
let channels = rong.channels();
3573+
let chan = channels.unordered_iter()
3574+
.skip((seed as usize) % channels.len())
3575+
.next().unwrap();
3576+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3577+
let amt = seed % chan.1.capacity_sats.map(|c| c * 1000)
3578+
.or(chan.1.one_to_two.as_ref().map(|info| info.htlc_maximum_msat))
3579+
.or(chan.1.two_to_one.as_ref().map(|info| info.htlc_maximum_msat))
3580+
.unwrap_or(1_000_000_000).saturating_add(1);
3581+
(*chan.0, chan.1.node_two, amt)
3582+
};
3583+
let path = Path {
3584+
hops: vec![RouteHop {
3585+
pubkey: victim_dst.as_pubkey().unwrap(),
3586+
node_features: NodeFeatures::empty(),
3587+
short_channel_id: victim,
3588+
channel_features: ChannelFeatures::empty(),
3589+
fee_msat: amt,
3590+
cltv_expiry_delta: 42,
3591+
maybe_announced_channel: true,
3592+
}],
3593+
blinded_tail: None
3594+
};
3595+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3596+
if seed % 1 == 0 {
3597+
scorer.probe_failed(&path, victim, Duration::ZERO);
3598+
} else {
3599+
scorer.probe_successful(&path, Duration::ZERO);
3600+
}
3601+
}
3602+
let mut cur_time = Duration::ZERO;
3603+
cur_time += Duration::from_millis(1);
3604+
scorer.decay_liquidity_certainty(cur_time);
3605+
bench.bench_function("decay_100k_channel_bounds", |b| b.iter(|| {
3606+
cur_time += Duration::from_millis(1);
3607+
scorer.decay_liquidity_certainty(cur_time);
3608+
}));
3609+
}
3610+
}

0 commit comments

Comments
 (0)