@@ -1469,3 +1469,58 @@ impl PhantomKeysManager {
1469
1469
pub fn dyn_sign ( ) {
1470
1470
let _signer: Box < dyn EcdsaChannelSigner > ;
1471
1471
}
1472
+
1473
+ #[ cfg( all( test, feature = "_bench_unstable" , not( feature = "no-std" ) ) ) ]
1474
+ mod benches {
1475
+ use std:: sync:: { Arc , mpsc} ;
1476
+ use std:: sync:: mpsc:: TryRecvError ;
1477
+ use std:: thread;
1478
+ use std:: time:: Duration ;
1479
+ use bitcoin:: blockdata:: constants:: genesis_block;
1480
+ use bitcoin:: Network ;
1481
+ use crate :: chain:: keysinterface:: { EntropySource , KeysManager } ;
1482
+
1483
+ use test:: Bencher ;
1484
+
1485
+ #[ bench]
1486
+ fn bench_get_secure_random_bytes ( bench : & mut Bencher ) {
1487
+ let seed = [ 0u8 ; 32 ] ;
1488
+ let now = Duration :: from_secs ( genesis_block ( Network :: Testnet ) . header . time as u64 ) ;
1489
+ let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_micros ( ) ) ) ;
1490
+
1491
+ let mut handles = Vec :: new ( ) ;
1492
+ let mut stops = Vec :: new ( ) ;
1493
+ for _ in 1 ..5 {
1494
+ let keys_manager_clone = Arc :: clone ( & keys_manager) ;
1495
+ let ( stop_sender, stop_receiver) = mpsc:: channel ( ) ;
1496
+ let handle = thread:: spawn ( move || {
1497
+ loop {
1498
+ keys_manager_clone. get_secure_random_bytes ( ) ;
1499
+ match stop_receiver. try_recv ( ) {
1500
+ Ok ( _) | Err ( TryRecvError :: Disconnected ) => {
1501
+ println ! ( "Terminating." ) ;
1502
+ break ;
1503
+ }
1504
+ Err ( TryRecvError :: Empty ) => { }
1505
+ }
1506
+ }
1507
+ } ) ;
1508
+ handles. push ( handle) ;
1509
+ stops. push ( stop_sender) ;
1510
+ }
1511
+
1512
+ bench. iter ( || {
1513
+ for _ in 1 ..100 {
1514
+ keys_manager. get_secure_random_bytes ( ) ;
1515
+ }
1516
+ } ) ;
1517
+
1518
+ for stop in stops {
1519
+ let _ = stop. send ( ( ) ) ;
1520
+ }
1521
+ for handle in handles {
1522
+ handle. join ( ) . unwrap ( ) ;
1523
+ }
1524
+ }
1525
+
1526
+ }
0 commit comments