Skip to content

Commit 3ce71e8

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 11a9cd4 commit 3ce71e8

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
@@ -3750,3 +3750,61 @@ mod tests {
37503750
Some(0.0));
37513751
}
37523752
}
3753+
3754+
#[cfg(ldk_bench)]
3755+
pub mod benches {
3756+
use super::*;
3757+
use criterion::Criterion;
3758+
use crate::routing::router::{bench_utils, RouteHop};
3759+
use crate::util::test_utils::TestLogger;
3760+
use crate::ln::features::{ChannelFeatures, NodeFeatures};
3761+
3762+
pub fn decay_100k_channel_bounds(bench: &mut Criterion) {
3763+
let logger = TestLogger::new();
3764+
let network_graph = bench_utils::read_network_graph(&logger).unwrap();
3765+
let mut scorer = ProbabilisticScorer::new(Default::default(), &network_graph, &logger);
3766+
// Score a number of random channels
3767+
let mut seed: u64 = 0xdeadbeef;
3768+
for _ in 0..100_000 {
3769+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3770+
let (victim, victim_dst, amt) = {
3771+
let rong = network_graph.read_only();
3772+
let channels = rong.channels();
3773+
let chan = channels.unordered_iter()
3774+
.skip((seed as usize) % channels.len())
3775+
.next().unwrap();
3776+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3777+
let amt = seed % chan.1.capacity_sats.map(|c| c * 1000)
3778+
.or(chan.1.one_to_two.as_ref().map(|info| info.htlc_maximum_msat))
3779+
.or(chan.1.two_to_one.as_ref().map(|info| info.htlc_maximum_msat))
3780+
.unwrap_or(1_000_000_000).saturating_add(1);
3781+
(*chan.0, chan.1.node_two, amt)
3782+
};
3783+
let path = Path {
3784+
hops: vec![RouteHop {
3785+
pubkey: victim_dst.as_pubkey().unwrap(),
3786+
node_features: NodeFeatures::empty(),
3787+
short_channel_id: victim,
3788+
channel_features: ChannelFeatures::empty(),
3789+
fee_msat: amt,
3790+
cltv_expiry_delta: 42,
3791+
maybe_announced_channel: true,
3792+
}],
3793+
blinded_tail: None
3794+
};
3795+
seed = seed.overflowing_mul(6364136223846793005).0.overflowing_add(1).0;
3796+
if seed % 1 == 0 {
3797+
scorer.probe_failed(&path, victim, Duration::ZERO);
3798+
} else {
3799+
scorer.probe_successful(&path, Duration::ZERO);
3800+
}
3801+
}
3802+
let mut cur_time = Duration::ZERO;
3803+
cur_time += Duration::from_millis(1);
3804+
scorer.decay_liquidity_certainty(cur_time);
3805+
bench.bench_function("decay_100k_channel_bounds", |b| b.iter(|| {
3806+
cur_time += Duration::from_millis(1);
3807+
scorer.decay_liquidity_certainty(cur_time);
3808+
}));
3809+
}
3810+
}

0 commit comments

Comments
 (0)