@@ -183,3 +183,71 @@ mod tests {
183
183
assert_eq ! ( path. len( ) , 19 ) ;
184
184
}
185
185
}
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