2019-05-17 11:09:42 -07:00
|
|
|
#![feature(test)]
|
|
|
|
|
2019-08-21 10:23:33 -07:00
|
|
|
extern crate solana_core;
|
2019-05-17 11:09:42 -07:00
|
|
|
extern crate test;
|
|
|
|
|
2019-06-26 18:42:27 -07:00
|
|
|
use crossbeam_channel::unbounded;
|
2019-05-17 11:09:42 -07:00
|
|
|
use log::*;
|
|
|
|
use rand::{thread_rng, Rng};
|
2019-10-28 16:07:51 -07:00
|
|
|
use solana_core::sigverify::TransactionSigVerifier;
|
2019-08-21 10:23:33 -07:00
|
|
|
use solana_core::sigverify_stage::SigVerifyStage;
|
2020-03-17 23:30:23 -07:00
|
|
|
use solana_perf::packet::to_packets_chunked;
|
2019-11-06 10:52:30 -08:00
|
|
|
use solana_perf::test_tx::test_tx;
|
2019-05-17 11:09:42 -07:00
|
|
|
use solana_sdk::hash::Hash;
|
2020-02-20 13:28:55 -08:00
|
|
|
use solana_sdk::signature::{Keypair, Signer};
|
2019-05-17 11:09:42 -07:00
|
|
|
use solana_sdk::system_transaction;
|
|
|
|
use solana_sdk::timing::duration_as_ms;
|
|
|
|
use std::sync::mpsc::channel;
|
|
|
|
use std::time::{Duration, Instant};
|
|
|
|
use test::Bencher;
|
|
|
|
|
|
|
|
#[bench]
|
|
|
|
fn bench_sigverify_stage(bencher: &mut Bencher) {
|
|
|
|
solana_logger::setup();
|
|
|
|
let (packet_s, packet_r) = channel();
|
2019-06-26 18:42:27 -07:00
|
|
|
let (verified_s, verified_r) = unbounded();
|
2019-10-28 16:07:51 -07:00
|
|
|
let verifier = TransactionSigVerifier::default();
|
|
|
|
let stage = SigVerifyStage::new(packet_r, verified_s, verifier);
|
2019-05-17 11:09:42 -07:00
|
|
|
|
|
|
|
let now = Instant::now();
|
|
|
|
let len = 4096;
|
|
|
|
let use_same_tx = true;
|
|
|
|
let chunk_size = 1024;
|
|
|
|
let mut batches = if use_same_tx {
|
|
|
|
let tx = test_tx();
|
|
|
|
to_packets_chunked(&vec![tx; len], chunk_size)
|
|
|
|
} else {
|
|
|
|
let from_keypair = Keypair::new();
|
|
|
|
let to_keypair = Keypair::new();
|
|
|
|
let txs: Vec<_> = (0..len)
|
|
|
|
.map(|_| {
|
|
|
|
let amount = thread_rng().gen();
|
2020-06-08 17:38:14 -07:00
|
|
|
system_transaction::transfer(
|
2019-05-17 11:09:42 -07:00
|
|
|
&from_keypair,
|
|
|
|
&to_keypair.pubkey(),
|
|
|
|
amount,
|
|
|
|
Hash::default(),
|
2020-06-08 17:38:14 -07:00
|
|
|
)
|
2019-05-17 11:09:42 -07:00
|
|
|
})
|
|
|
|
.collect();
|
|
|
|
to_packets_chunked(&txs, chunk_size)
|
|
|
|
};
|
|
|
|
|
|
|
|
trace!(
|
|
|
|
"starting... generation took: {} ms batches: {}",
|
|
|
|
duration_as_ms(&now.elapsed()),
|
|
|
|
batches.len()
|
|
|
|
);
|
|
|
|
bencher.iter(move || {
|
|
|
|
let mut sent_len = 0;
|
|
|
|
for _ in 0..batches.len() {
|
|
|
|
if let Some(batch) = batches.pop() {
|
|
|
|
sent_len += batch.packets.len();
|
|
|
|
packet_s.send(batch).unwrap();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let mut received = 0;
|
2019-05-22 13:00:03 -07:00
|
|
|
trace!("sent: {}", sent_len);
|
2019-05-17 11:09:42 -07:00
|
|
|
loop {
|
|
|
|
if let Ok(mut verifieds) = verified_r.recv_timeout(Duration::from_millis(10)) {
|
|
|
|
while let Some(v) = verifieds.pop() {
|
2019-11-01 14:23:03 -07:00
|
|
|
received += v.packets.len();
|
|
|
|
batches.push(v);
|
2019-05-17 11:09:42 -07:00
|
|
|
}
|
|
|
|
if received >= sent_len {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-05-22 13:00:03 -07:00
|
|
|
trace!("received: {}", received);
|
2019-05-17 11:09:42 -07:00
|
|
|
});
|
|
|
|
stage.join().unwrap();
|
|
|
|
}
|