solana/runtime/benches/bank.rs

77 lines
2.5 KiB
Rust
Raw Normal View History

#![feature(test)]
extern crate test;
use solana_runtime::bank::*;
use solana_runtime::bank_client::BankClient;
use solana_sdk::client::AsyncClient;
use solana_sdk::genesis_block::GenesisBlock;
2018-11-16 08:04:46 -08:00
use solana_sdk::hash::hash;
2018-12-03 10:26:28 -08:00
use solana_sdk::signature::{Keypair, KeypairUtil};
use solana_sdk::system_transaction;
2019-03-02 16:35:13 -08:00
use solana_sdk::timing::{DEFAULT_TICKS_PER_SLOT, MAX_RECENT_BLOCKHASHES};
use solana_sdk::transaction::Transaction;
use test::Bencher;
// Create transactions between unrelated parties.
pub fn create_sample_transactions(bank: &Bank, mint_keypair: &Keypair) -> Vec<Transaction> {
(0..4096)
.into_iter()
.map(|_| {
// Seed the 'from' account.
2018-08-09 07:56:04 -07:00
let rando0 = Keypair::new();
let tx = system_transaction::transfer(
&mint_keypair,
2019-03-25 13:10:56 -07:00
&rando0.pubkey(),
10_000,
2019-03-02 10:25:16 -08:00
bank.last_blockhash(),
0,
);
assert_eq!(bank.process_transaction(&tx), Ok(()));
// Seed the 'to' account and a cell for its signature.
2018-08-09 07:56:04 -07:00
let rando1 = Keypair::new();
system_transaction::transfer(&rando0, &rando1.pubkey(), 1, bank.last_blockhash(), 0)
})
.collect()
}
#[bench]
fn bench_process_transaction(bencher: &mut Bencher) {
let (genesis_block, mint_keypair) = GenesisBlock::new(100_000_000);
let bank = Bank::new(&genesis_block);
let transactions = create_sample_transactions(&bank, &mint_keypair);
// Run once to create all the 'to' accounts.
let results = bank.process_transactions(&transactions);
assert!(results.iter().all(Result::is_ok));
let mut id = bank.last_blockhash();
2019-03-02 16:35:13 -08:00
for _ in 0..(MAX_RECENT_BLOCKHASHES * DEFAULT_TICKS_PER_SLOT as usize) {
bank.register_tick(&id);
id = hash(&id.as_ref())
}
bencher.iter(|| {
// Since benchmarker runs this multiple times, we need to clear the signatures.
bank.clear_signatures();
let results = bank.process_transactions(&transactions);
assert!(results.iter().all(Result::is_ok));
})
2018-07-10 15:30:56 -07:00
}
#[bench]
fn bench_bank_client(bencher: &mut Bencher) {
let (genesis_block, mint_keypair) = GenesisBlock::new(100_000_000);
let bank = Bank::new(&genesis_block);
let transactions = create_sample_transactions(&bank, &mint_keypair);
bencher.iter(|| {
let bank = Bank::new(&genesis_block);
let bank_client = BankClient::new(bank);
for transaction in transactions.clone() {
bank_client.async_send_transaction(transaction).unwrap();
}
})
}