@@ -1469,3 +1469,58 @@ impl PhantomKeysManager {
14691469pub fn dyn_sign ( ) {
14701470 let _signer: Box < dyn EcdsaChannelSigner > ;
14711471}
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