@ -1,69 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use solana_runtime::accounts::{create_test_accounts, Accounts};
|
||||
use solana_runtime::bank::*;
|
||||
use solana_sdk::account::Account;
|
||||
use solana_sdk::genesis_block::create_genesis_block;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use std::sync::Arc;
|
||||
use test::Bencher;
|
||||
|
||||
fn deposit_many(bank: &Bank, pubkeys: &mut Vec<Pubkey>, num: usize) {
|
||||
for t in 0..num {
|
||||
let pubkey = Pubkey::new_rand();
|
||||
let account = Account::new((t + 1) as u64, 0, &Account::default().owner);
|
||||
pubkeys.push(pubkey.clone());
|
||||
assert!(bank.get_account(&pubkey).is_none());
|
||||
bank.deposit(&pubkey, (t + 1) as u64);
|
||||
assert_eq!(bank.get_account(&pubkey).unwrap(), account);
|
||||
}
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn test_accounts_create(bencher: &mut Bencher) {
|
||||
let (genesis_block, _) = create_genesis_block(10_000);
|
||||
let bank0 = Bank::new_with_paths(&genesis_block, Some("bench_a0".to_string()));
|
||||
bencher.iter(|| {
|
||||
let mut pubkeys: Vec<Pubkey> = vec![];
|
||||
deposit_many(&bank0, &mut pubkeys, 1000);
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn test_accounts_squash(bencher: &mut Bencher) {
|
||||
let (genesis_block, _) = create_genesis_block(100_000);
|
||||
let mut banks: Vec<Arc<Bank>> = Vec::with_capacity(10);
|
||||
banks.push(Arc::new(Bank::new_with_paths(
|
||||
&genesis_block,
|
||||
Some("bench_a1".to_string()),
|
||||
)));
|
||||
let mut pubkeys: Vec<Pubkey> = vec![];
|
||||
deposit_many(&banks[0], &mut pubkeys, 250000);
|
||||
banks[0].freeze();
|
||||
// Measures the performance of the squash operation merging the accounts
|
||||
// with the majority of the accounts present in the parent bank that is
|
||||
// moved over to this bank.
|
||||
bencher.iter(|| {
|
||||
banks.push(Arc::new(Bank::new_from_parent(
|
||||
&banks[0],
|
||||
&Pubkey::default(),
|
||||
1u64,
|
||||
)));
|
||||
for accounts in 0..10000 {
|
||||
banks[1].deposit(&pubkeys[accounts], (accounts + 1) as u64);
|
||||
}
|
||||
banks[1].squash();
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn test_accounts_hash_internal_state(bencher: &mut Bencher) {
|
||||
let accounts = Accounts::new(Some("bench_accounts_hash_internal".to_string()));
|
||||
let mut pubkeys: Vec<Pubkey> = vec![];
|
||||
create_test_accounts(&accounts, &mut pubkeys, 60000, 0);
|
||||
bencher.iter(|| {
|
||||
accounts.hash_internal_state(0);
|
||||
});
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use rand::{thread_rng, Rng};
|
||||
use solana_runtime::accounts_db::AccountInfo;
|
||||
use solana_runtime::accounts_index::AccountsIndex;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
fn bench_accounts_index(bencher: &mut Bencher) {
|
||||
const NUM_PUBKEYS: usize = 10_000;
|
||||
let pubkeys: Vec<_> = (0..NUM_PUBKEYS)
|
||||
.into_iter()
|
||||
.map(|_| Pubkey::new_rand())
|
||||
.collect();
|
||||
|
||||
const NUM_FORKS: u64 = 16;
|
||||
|
||||
let mut reclaims = vec![];
|
||||
let mut index = AccountsIndex::<AccountInfo>::default();
|
||||
for f in 0..NUM_FORKS {
|
||||
for _p in 0..NUM_PUBKEYS {
|
||||
index.insert(f, &pubkeys[_p], AccountInfo::default(), &mut reclaims);
|
||||
}
|
||||
}
|
||||
|
||||
let mut fork = NUM_FORKS;
|
||||
let mut root = 0;
|
||||
bencher.iter(|| {
|
||||
for _p in 0..NUM_PUBKEYS {
|
||||
let pubkey = thread_rng().gen_range(0, NUM_PUBKEYS);
|
||||
index.insert(
|
||||
fork,
|
||||
&pubkeys[pubkey],
|
||||
AccountInfo::default(),
|
||||
&mut reclaims,
|
||||
);
|
||||
reclaims.clear();
|
||||
}
|
||||
index.add_root(root);
|
||||
root += 1;
|
||||
fork += 1;
|
||||
});
|
||||
}
|
@ -1,128 +0,0 @@
|
||||
#![feature(test)]
|
||||
extern crate test;
|
||||
|
||||
use rand::{thread_rng, Rng};
|
||||
use solana_runtime::append_vec::test_utils::{create_test_account, get_append_vec_path};
|
||||
use solana_runtime::append_vec::AppendVec;
|
||||
use solana_sdk::hash::Hash;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use std::thread::sleep;
|
||||
use std::thread::spawn;
|
||||
use std::time::Duration;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
fn append_vec_append(bencher: &mut Bencher) {
|
||||
let path = get_append_vec_path("bench_append");
|
||||
let vec = AppendVec::new(&path.path, true, 64 * 1024);
|
||||
bencher.iter(|| {
|
||||
let (meta, account) = create_test_account(0);
|
||||
if vec
|
||||
.append_account(meta, &account, Hash::default())
|
||||
.is_none()
|
||||
{
|
||||
vec.reset();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn add_test_accounts(vec: &AppendVec, size: usize) -> Vec<(usize, usize)> {
|
||||
(0..size)
|
||||
.into_iter()
|
||||
.filter_map(|sample| {
|
||||
let (meta, account) = create_test_account(sample);
|
||||
vec.append_account(meta, &account, Hash::default())
|
||||
.map(|pos| (sample, pos))
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn append_vec_sequential_read(bencher: &mut Bencher) {
|
||||
let path = get_append_vec_path("seq_read");
|
||||
let vec = AppendVec::new(&path.path, true, 64 * 1024);
|
||||
let size = 1_000;
|
||||
let mut indexes = add_test_accounts(&vec, size);
|
||||
bencher.iter(|| {
|
||||
let (sample, pos) = indexes.pop().unwrap();
|
||||
let (account, _next) = vec.get_account(pos).unwrap();
|
||||
let (_meta, test) = create_test_account(sample);
|
||||
assert_eq!(account.data, test.data.as_slice());
|
||||
indexes.push((sample, pos));
|
||||
});
|
||||
}
|
||||
#[bench]
|
||||
fn append_vec_random_read(bencher: &mut Bencher) {
|
||||
let path = get_append_vec_path("random_read");
|
||||
let vec = AppendVec::new(&path.path, true, 64 * 1024);
|
||||
let size = 1_000;
|
||||
let indexes = add_test_accounts(&vec, size);
|
||||
bencher.iter(|| {
|
||||
let random_index: usize = thread_rng().gen_range(0, indexes.len());
|
||||
let (sample, pos) = &indexes[random_index];
|
||||
let (account, _next) = vec.get_account(*pos).unwrap();
|
||||
let (_meta, test) = create_test_account(*sample);
|
||||
assert_eq!(account.data, test.data.as_slice());
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn append_vec_concurrent_append_read(bencher: &mut Bencher) {
|
||||
let path = get_append_vec_path("concurrent_read");
|
||||
let vec = Arc::new(AppendVec::new(&path.path, true, 1024 * 1024));
|
||||
let vec1 = vec.clone();
|
||||
let indexes: Arc<Mutex<Vec<(usize, usize)>>> = Arc::new(Mutex::new(vec![]));
|
||||
let indexes1 = indexes.clone();
|
||||
spawn(move || loop {
|
||||
let sample = indexes1.lock().unwrap().len();
|
||||
let (meta, account) = create_test_account(sample);
|
||||
if let Some(pos) = vec1.append_account(meta, &account, Hash::default()) {
|
||||
indexes1.lock().unwrap().push((sample, pos))
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
});
|
||||
while indexes.lock().unwrap().is_empty() {
|
||||
sleep(Duration::from_millis(100));
|
||||
}
|
||||
bencher.iter(|| {
|
||||
let len = indexes.lock().unwrap().len();
|
||||
let random_index: usize = thread_rng().gen_range(0, len);
|
||||
let (sample, pos) = indexes.lock().unwrap().get(random_index).unwrap().clone();
|
||||
let (account, _next) = vec.get_account(pos).unwrap();
|
||||
let (_meta, test) = create_test_account(sample);
|
||||
assert_eq!(account.data, test.data.as_slice());
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn append_vec_concurrent_read_append(bencher: &mut Bencher) {
|
||||
let path = get_append_vec_path("concurrent_read");
|
||||
let vec = Arc::new(AppendVec::new(&path.path, true, 1024 * 1024));
|
||||
let vec1 = vec.clone();
|
||||
let indexes: Arc<Mutex<Vec<(usize, usize)>>> = Arc::new(Mutex::new(vec![]));
|
||||
let indexes1 = indexes.clone();
|
||||
spawn(move || loop {
|
||||
let len = indexes1.lock().unwrap().len();
|
||||
if len == 0 {
|
||||
continue;
|
||||
}
|
||||
let random_index: usize = thread_rng().gen_range(0, len + 1);
|
||||
let (sample, pos) = indexes1
|
||||
.lock()
|
||||
.unwrap()
|
||||
.get(random_index % len)
|
||||
.unwrap()
|
||||
.clone();
|
||||
let (account, _next) = vec1.get_account(pos).unwrap();
|
||||
let (_meta, test) = create_test_account(sample);
|
||||
assert_eq!(account.data, test.data.as_slice());
|
||||
});
|
||||
bencher.iter(|| {
|
||||
let sample: usize = thread_rng().gen_range(0, 256);
|
||||
let (meta, account) = create_test_account(sample);
|
||||
if let Some(pos) = vec.append_account(meta, &account, Hash::default()) {
|
||||
indexes.lock().unwrap().push((sample, pos))
|
||||
}
|
||||
});
|
||||
}
|
@ -1,175 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use log::*;
|
||||
use solana_runtime::bank::*;
|
||||
use solana_runtime::bank_client::BankClient;
|
||||
use solana_runtime::loader_utils::create_invoke_instruction;
|
||||
use solana_sdk::account::KeyedAccount;
|
||||
use solana_sdk::client::AsyncClient;
|
||||
use solana_sdk::client::SyncClient;
|
||||
use solana_sdk::genesis_block::create_genesis_block;
|
||||
use solana_sdk::instruction::InstructionError;
|
||||
use solana_sdk::pubkey::Pubkey;
|
||||
use solana_sdk::signature::{Keypair, KeypairUtil};
|
||||
use solana_sdk::transaction::Transaction;
|
||||
use std::sync::Arc;
|
||||
use std::thread::sleep;
|
||||
use std::time::Duration;
|
||||
use test::Bencher;
|
||||
|
||||
const BUILTIN_PROGRAM_ID: [u8; 32] = [
|
||||
098, 117, 105, 108, 116, 105, 110, 095, 112, 114, 111, 103, 114, 097, 109, 095, 105, 100, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
];
|
||||
|
||||
const NOOP_PROGRAM_ID: [u8; 32] = [
|
||||
098, 117, 105, 108, 116, 105, 110, 095, 112, 114, 111, 103, 114, 097, 109, 095, 105, 100, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
|
||||
];
|
||||
|
||||
fn process_instruction(
|
||||
_program_id: &Pubkey,
|
||||
_keyed_accounts: &mut [KeyedAccount],
|
||||
_data: &[u8],
|
||||
) -> Result<(), InstructionError> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn create_builtin_transactions(
|
||||
bank_client: &BankClient,
|
||||
mint_keypair: &Keypair,
|
||||
) -> Vec<Transaction> {
|
||||
let program_id = Pubkey::new(&BUILTIN_PROGRAM_ID);
|
||||
|
||||
(0..4096)
|
||||
.into_iter()
|
||||
.map(|_| {
|
||||
// Seed the signer account
|
||||
let rando0 = Keypair::new();
|
||||
bank_client
|
||||
.transfer(10_000, &mint_keypair, &rando0.pubkey())
|
||||
.expect(&format!("{}:{}", line!(), file!()));
|
||||
|
||||
let instruction = create_invoke_instruction(rando0.pubkey(), program_id, &1u8);
|
||||
let (blockhash, _fee_calculator) = bank_client.get_recent_blockhash().unwrap();
|
||||
Transaction::new_signed_instructions(&[&rando0], vec![instruction], blockhash)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn create_native_loader_transactions(
|
||||
bank_client: &BankClient,
|
||||
mint_keypair: &Keypair,
|
||||
) -> Vec<Transaction> {
|
||||
let program_id = Pubkey::new(&NOOP_PROGRAM_ID);
|
||||
|
||||
(0..4096)
|
||||
.into_iter()
|
||||
.map(|_| {
|
||||
// Seed the signer account©41
|
||||
let rando0 = Keypair::new();
|
||||
bank_client
|
||||
.transfer(10_000, &mint_keypair, &rando0.pubkey())
|
||||
.expect(&format!("{}:{}", line!(), file!()));
|
||||
|
||||
let instruction = create_invoke_instruction(rando0.pubkey(), program_id, &1u8);
|
||||
let (blockhash, _fee_calculator) = bank_client.get_recent_blockhash().unwrap();
|
||||
Transaction::new_signed_instructions(&[&rando0], vec![instruction], blockhash)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn sync_bencher(bank: &Arc<Bank>, _bank_client: &BankClient, transactions: &Vec<Transaction>) {
|
||||
let results = bank.process_transactions(&transactions);
|
||||
assert!(results.iter().all(Result::is_ok));
|
||||
}
|
||||
|
||||
fn async_bencher(bank: &Arc<Bank>, bank_client: &BankClient, transactions: &Vec<Transaction>) {
|
||||
for transaction in transactions.clone() {
|
||||
bank_client.async_send_transaction(transaction).unwrap();
|
||||
}
|
||||
for _ in 0..1_000_000_000_u64 {
|
||||
if bank
|
||||
.get_signature_status(&transactions.last().unwrap().signatures.get(0).unwrap())
|
||||
.is_some()
|
||||
{
|
||||
break;
|
||||
}
|
||||
sleep(Duration::from_nanos(1));
|
||||
}
|
||||
if !bank
|
||||
.get_signature_status(&transactions.last().unwrap().signatures.get(0).unwrap())
|
||||
.unwrap()
|
||||
.is_ok()
|
||||
{
|
||||
error!(
|
||||
"transaction failed: {:?}",
|
||||
bank.get_signature_status(&transactions.last().unwrap().signatures.get(0).unwrap())
|
||||
.unwrap()
|
||||
);
|
||||
assert!(false);
|
||||
}
|
||||
}
|
||||
|
||||
fn do_bench_transactions(
|
||||
bencher: &mut Bencher,
|
||||
bench_work: &dyn Fn(&Arc<Bank>, &BankClient, &Vec<Transaction>),
|
||||
create_transactions: &dyn Fn(&BankClient, &Keypair) -> Vec<Transaction>,
|
||||
) {
|
||||
solana_logger::setup();
|
||||
let ns_per_s = 1_000_000_000;
|
||||
let (mut genesis_block, mint_keypair) = create_genesis_block(100_000_000);
|
||||
genesis_block.ticks_per_slot = 100;
|
||||
let mut bank = Bank::new(&genesis_block);
|
||||
bank.add_instruction_processor(Pubkey::new(&BUILTIN_PROGRAM_ID), process_instruction);
|
||||
bank.register_native_instruction_processor(
|
||||
"solana_noop_program",
|
||||
&Pubkey::new(&NOOP_PROGRAM_ID),
|
||||
);
|
||||
let bank = Arc::new(bank);
|
||||
let bank_client = BankClient::new_shared(&bank);
|
||||
let transactions = create_transactions(&bank_client, &mint_keypair);
|
||||
|
||||
// Do once to fund accounts, load modules, etc...
|
||||
let results = bank.process_transactions(&transactions);
|
||||
assert!(results.iter().all(Result::is_ok));
|
||||
|
||||
bencher.iter(|| {
|
||||
// Since bencher runs this multiple times, we need to clear the signatures.
|
||||
bank.clear_signatures();
|
||||
bench_work(&bank, &bank_client, &transactions);
|
||||
});
|
||||
|
||||
let summary = bencher.bench(|_bencher| {}).unwrap();
|
||||
info!(" {:?} transactions", transactions.len());
|
||||
info!(" {:?} ns/iter median", summary.median as u64);
|
||||
assert!(0f64 != summary.median);
|
||||
let tps = transactions.len() as u64 * (ns_per_s / summary.median as u64);
|
||||
info!(" {:?} TPS", tps);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bank_sync_process_builtin_transactions(bencher: &mut Bencher) {
|
||||
do_bench_transactions(bencher, &sync_bencher, &create_builtin_transactions);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bank_sync_process_native_loader_transactions(bencher: &mut Bencher) {
|
||||
do_bench_transactions(bencher, &sync_bencher, &create_native_loader_transactions);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bank_async_process_builtin_transactions(bencher: &mut Bencher) {
|
||||
do_bench_transactions(bencher, &async_bencher, &create_builtin_transactions);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bank_async_process_native_loader_transactions(bencher: &mut Bencher) {
|
||||
do_bench_transactions(bencher, &async_bencher, &create_native_loader_transactions);
|
||||
}
|
@ -1,100 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
use bv::BitVec;
|
||||
use fnv::FnvHasher;
|
||||
use solana_runtime::bloom::{Bloom, BloomHashIndex};
|
||||
use solana_sdk::hash::{hash, Hash};
|
||||
use solana_sdk::signature::Signature;
|
||||
use std::collections::HashSet;
|
||||
use std::hash::Hasher;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bits_set(bencher: &mut Bencher) {
|
||||
let mut bits: BitVec<u8> = BitVec::new_fill(false, 38_340_234 as u64);
|
||||
let mut hasher = FnvHasher::default();
|
||||
|
||||
bencher.iter(|| {
|
||||
let idx = hasher.finish() % bits.len();
|
||||
bits.set(idx, true);
|
||||
hasher.write_u64(idx);
|
||||
});
|
||||
// subtract the next bencher result from this one to get a number for raw
|
||||
// bits.set()
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_bits_set_hasher(bencher: &mut Bencher) {
|
||||
let bits: BitVec<u8> = BitVec::new_fill(false, 38_340_234 as u64);
|
||||
let mut hasher = FnvHasher::default();
|
||||
|
||||
bencher.iter(|| {
|
||||
let idx = hasher.finish() % bits.len();
|
||||
hasher.write_u64(idx);
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_sigs_bloom(bencher: &mut Bencher) {
|
||||
// 1M TPS * 1s (length of block in sigs) == 1M items in filter
|
||||
// 1.0E-8 false positive rate
|
||||
// https://hur.st/bloomfilter/?n=1000000&p=1.0E-8&m=&k=
|
||||
let blockhash = hash(Hash::default().as_ref());
|
||||
// info!("blockhash = {:?}", blockhash);
|
||||
let keys = (0..27)
|
||||
.into_iter()
|
||||
.map(|i| blockhash.hash_at_index(i))
|
||||
.collect();
|
||||
let mut sigs: Bloom<Signature> = Bloom::new(38_340_234, keys);
|
||||
|
||||
let mut id = blockhash;
|
||||
let mut falses = 0;
|
||||
let mut iterations = 0;
|
||||
bencher.iter(|| {
|
||||
id = hash(id.as_ref());
|
||||
let mut sigbytes = Vec::from(id.as_ref());
|
||||
id = hash(id.as_ref());
|
||||
sigbytes.extend(id.as_ref());
|
||||
|
||||
let sig = Signature::new(&sigbytes);
|
||||
if sigs.contains(&sig) {
|
||||
falses += 1;
|
||||
}
|
||||
sigs.add(&sig);
|
||||
sigs.contains(&sig);
|
||||
iterations += 1;
|
||||
});
|
||||
assert_eq!(falses, 0);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_sigs_hashmap(bencher: &mut Bencher) {
|
||||
// same structure as above, new
|
||||
let blockhash = hash(Hash::default().as_ref());
|
||||
// info!("blockhash = {:?}", blockhash);
|
||||
let mut sigs: HashSet<Signature> = HashSet::new();
|
||||
|
||||
let mut id = blockhash;
|
||||
let mut falses = 0;
|
||||
let mut iterations = 0;
|
||||
bencher.iter(|| {
|
||||
id = hash(id.as_ref());
|
||||
let mut sigbytes = Vec::from(id.as_ref());
|
||||
id = hash(id.as_ref());
|
||||
sigbytes.extend(id.as_ref());
|
||||
|
||||
let sig = Signature::new(&sigbytes);
|
||||
if sigs.contains(&sig) {
|
||||
falses += 1;
|
||||
}
|
||||
sigs.insert(sig);
|
||||
sigs.contains(&sig);
|
||||
iterations += 1;
|
||||
});
|
||||
assert_eq!(falses, 0);
|
||||
}
|
@ -1,14 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use solana_runtime::message_processor::*;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
fn bench_has_duplicates(bencher: &mut Bencher) {
|
||||
bencher.iter(|| {
|
||||
let data = test::black_box([1, 2, 3]);
|
||||
assert!(!has_duplicates(&data));
|
||||
})
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use bincode::serialize;
|
||||
use solana_runtime::status_cache::*;
|
||||
use solana_sdk::hash::{hash, Hash};
|
||||
use solana_sdk::signature::Signature;
|
||||
use test::Bencher;
|
||||
|
||||
type BankStatusCache = StatusCache<()>;
|
||||
|
||||
#[bench]
|
||||
fn test_statuscache_serialize(bencher: &mut Bencher) {
|
||||
let mut status_cache = BankStatusCache::default();
|
||||
status_cache.add_root(0);
|
||||
status_cache.clear_signatures();
|
||||
for hash_index in 0..100 {
|
||||
let blockhash = Hash::new(&vec![hash_index; std::mem::size_of::<Hash>()]);
|
||||
let mut id = blockhash;
|
||||
for _ in 0..100 {
|
||||
id = hash(id.as_ref());
|
||||
let mut sigbytes = Vec::from(id.as_ref());
|
||||
id = hash(id.as_ref());
|
||||
sigbytes.extend(id.as_ref());
|
||||
let sig = Signature::new(&sigbytes);
|
||||
status_cache.insert(&blockhash, &sig, 0, ());
|
||||
}
|
||||
}
|
||||
bencher.iter(|| {
|
||||
let _ = serialize(&status_cache.slot_deltas(&vec![0])).unwrap();
|
||||
});
|
||||
}
|
@ -1,19 +0,0 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
|
||||
use rand::seq::SliceRandom;
|
||||
use rand::thread_rng;
|
||||
use solana_runtime::transaction_utils::OrderedIterator;
|
||||
use test::Bencher;
|
||||
|
||||
#[bench]
|
||||
fn bench_ordered_iterator_with_order_shuffling(bencher: &mut Bencher) {
|
||||
let vec: Vec<usize> = (0..100_usize).collect();
|
||||
bencher.iter(|| {
|
||||
let mut order: Vec<usize> = (0..100_usize).collect();
|
||||
order.shuffle(&mut thread_rng());
|
||||
let _ordered_iterator_resp: Vec<&usize> =
|
||||
OrderedIterator::new(&vec, Some(&order)).collect();
|
||||
});
|
||||
}
|
Reference in New Issue
Block a user