2019-10-01 09:38:29 -07:00
|
|
|
#![feature(test)]
|
|
|
|
|
|
|
|
extern crate test;
|
|
|
|
|
2021-08-20 06:48:33 -07:00
|
|
|
use {
|
|
|
|
rand::{thread_rng, Rng},
|
|
|
|
solana_core::{
|
|
|
|
broadcast_stage::{
|
|
|
|
broadcast_metrics::TransmitShredsStats, broadcast_shreds, BroadcastStage,
|
|
|
|
},
|
|
|
|
cluster_nodes::ClusterNodesCache,
|
|
|
|
},
|
|
|
|
solana_gossip::{
|
|
|
|
cluster_info::{ClusterInfo, Node},
|
2023-01-08 08:00:55 -08:00
|
|
|
legacy_contact_info::LegacyContactInfo as ContactInfo,
|
2021-08-20 06:48:33 -07:00
|
|
|
},
|
|
|
|
solana_ledger::{
|
|
|
|
genesis_utils::{create_genesis_config, GenesisConfigInfo},
|
2022-05-02 16:33:53 -07:00
|
|
|
shred::{Shred, ShredFlags},
|
2021-08-20 06:48:33 -07:00
|
|
|
},
|
|
|
|
solana_runtime::{bank::Bank, bank_forks::BankForks},
|
|
|
|
solana_sdk::{
|
|
|
|
pubkey,
|
2023-01-24 08:57:55 -08:00
|
|
|
signature::{Keypair, Signer},
|
2021-08-20 06:48:33 -07:00
|
|
|
timing::{timestamp, AtomicInterval},
|
|
|
|
},
|
|
|
|
solana_streamer::socket::SocketAddrSpace,
|
|
|
|
std::{
|
|
|
|
collections::HashMap,
|
|
|
|
net::UdpSocket,
|
|
|
|
sync::{Arc, RwLock},
|
|
|
|
time::Duration,
|
|
|
|
},
|
|
|
|
test::Bencher,
|
2021-07-06 17:35:25 -07:00
|
|
|
};
|
2019-10-01 09:38:29 -07:00
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn broadcast_shreds_bench(bencher: &mut Bencher) {
|
|
|
|
solana_logger::setup();
|
2023-01-24 08:57:55 -08:00
|
|
|
let leader_keypair = Arc::new(Keypair::new());
|
|
|
|
let leader_info = Node::new_localhost_with_pubkey(&leader_keypair.pubkey());
|
2021-07-23 08:25:03 -07:00
|
|
|
let cluster_info = ClusterInfo::new(
|
|
|
|
leader_info.info,
|
2023-01-24 08:57:55 -08:00
|
|
|
leader_keypair,
|
2021-07-23 08:25:03 -07:00
|
|
|
SocketAddrSpace::Unspecified,
|
|
|
|
);
|
2019-10-01 09:38:29 -07:00
|
|
|
let socket = UdpSocket::bind("0.0.0.0:0").unwrap();
|
|
|
|
|
2021-07-07 08:21:12 -07:00
|
|
|
let GenesisConfigInfo { genesis_config, .. } = create_genesis_config(10_000);
|
2021-08-04 15:30:43 -07:00
|
|
|
let bank = Bank::new_for_benches(&genesis_config);
|
2021-07-07 08:21:12 -07:00
|
|
|
let bank_forks = Arc::new(RwLock::new(BankForks::new(bank)));
|
|
|
|
|
2019-10-01 09:38:29 -07:00
|
|
|
const NUM_SHREDS: usize = 32;
|
2022-05-02 16:33:53 -07:00
|
|
|
let shred = Shred::new_from_data(0, 0, 0, &[], ShredFlags::empty(), 0, 0, 0);
|
2022-04-26 16:13:12 -07:00
|
|
|
let shreds = vec![shred; NUM_SHREDS];
|
2019-10-01 09:38:29 -07:00
|
|
|
let mut stakes = HashMap::new();
|
|
|
|
const NUM_PEERS: usize = 200;
|
|
|
|
for _ in 0..NUM_PEERS {
|
2020-10-19 12:23:14 -07:00
|
|
|
let id = pubkey::new_rand();
|
2019-10-01 09:38:29 -07:00
|
|
|
let contact_info = ContactInfo::new_localhost(&id, timestamp());
|
|
|
|
cluster_info.insert_info(contact_info);
|
|
|
|
stakes.insert(id, thread_rng().gen_range(1, NUM_PEERS) as u64);
|
|
|
|
}
|
2020-04-21 12:54:45 -07:00
|
|
|
let cluster_info = Arc::new(cluster_info);
|
2021-08-20 06:48:33 -07:00
|
|
|
let cluster_nodes_cache = ClusterNodesCache::<BroadcastStage>::new(
|
|
|
|
8, // cap
|
|
|
|
Duration::from_secs(5), // ttl
|
|
|
|
);
|
2020-04-06 17:36:22 -07:00
|
|
|
let shreds = Arc::new(shreds);
|
2021-07-28 18:16:36 -07:00
|
|
|
let last_datapoint = Arc::new(AtomicInterval::default());
|
2019-10-01 09:38:29 -07:00
|
|
|
bencher.iter(move || {
|
2019-10-10 19:38:48 -07:00
|
|
|
let shreds = shreds.clone();
|
2020-04-06 17:36:22 -07:00
|
|
|
broadcast_shreds(
|
|
|
|
&socket,
|
|
|
|
&shreds,
|
2021-08-20 06:48:33 -07:00
|
|
|
&cluster_nodes_cache,
|
2020-04-14 21:21:58 -07:00
|
|
|
&last_datapoint,
|
2020-06-03 08:24:05 -07:00
|
|
|
&mut TransmitShredsStats::default(),
|
2021-08-20 06:48:33 -07:00
|
|
|
&cluster_info,
|
2021-07-07 08:21:12 -07:00
|
|
|
&bank_forks,
|
2021-07-23 08:25:03 -07:00
|
|
|
&SocketAddrSpace::Unspecified,
|
2020-04-06 17:36:22 -07:00
|
|
|
)
|
|
|
|
.unwrap();
|
2019-10-01 09:38:29 -07:00
|
|
|
});
|
|
|
|
}
|