solana/perf/benches/sigverify.rs

189 lines
5.7 KiB
Rust
Raw Normal View History

#![feature(test)]
extern crate test;
use {
log::*,
rand::{thread_rng, Rng},
solana_perf::{
packet::{to_packet_batches, Packet, PacketBatch},
recycler::Recycler,
sigverify,
test_tx::{test_multisig_tx, test_tx},
},
test::Bencher,
};
const NUM: usize = 256;
const LARGE_BATCH_PACKET_COUNT: usize = 128;
#[bench]
fn bench_sigverify_simple(bencher: &mut Bencher) {
let tx = test_tx();
let num_packets = NUM;
// generate packet vector
let mut batches = to_packet_batches(
&std::iter::repeat(tx).take(num_packets).collect::<Vec<_>>(),
128,
);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
// verify packets
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
fn gen_batches(
use_same_tx: bool,
packets_per_batch: usize,
total_packets: usize,
) -> Vec<PacketBatch> {
if use_same_tx {
let tx = test_tx();
to_packet_batches(&vec![tx; total_packets], packets_per_batch)
} else {
let txs: Vec<_> = std::iter::repeat_with(test_tx)
.take(total_packets)
.collect();
to_packet_batches(&txs, packets_per_batch)
}
}
#[bench]
#[ignore]
fn bench_sigverify_low_packets_small_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE - 1;
let mut batches = gen_batches(false, 1, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_low_packets_large_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE - 1;
let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_medium_packets_small_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 8;
let mut batches = gen_batches(false, 1, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_medium_packets_large_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 8;
let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_high_packets_small_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 32;
let mut batches = gen_batches(false, 1, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_high_packets_large_batch(bencher: &mut Bencher) {
let num_packets = sigverify::VERIFY_PACKET_CHUNK_SIZE * 32;
let mut batches = gen_batches(false, LARGE_BATCH_PACKET_COUNT, num_packets);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
// verify packets
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
#[ignore]
fn bench_sigverify_uneven(bencher: &mut Bencher) {
solana_logger::setup();
let simple_tx = test_tx();
let multi_tx = test_multisig_tx();
let mut tx;
let num_packets = NUM * 50;
let mut num_valid = 0;
let mut current_packets = 0;
// generate packet vector
let mut batches = vec![];
while current_packets < num_packets {
Bump rand to 0.8, rand_chacha to 0.3, getrandom to 0.2 (#32871) * sdk: Add concurrent support for rand 0.7 and 0.8 * Update rand, rand_chacha, and getrandom versions * Run command to replace `gen_range` Run `git grep -l gen_range | xargs sed -i'' -e 's/gen_range(\(\S*\), /gen_range(\1../' * sdk: Fix users of older `gen_range` * Replace `hash::new_rand` with `hash::new_with_thread_rng` Run: ``` git grep -l hash::new_rand | xargs sed -i'' -e 's/hash::new_rand([^)]*/hash::new_with_thread_rng(/' ``` * perf: Use `Keypair::new()` instead of `generate` * Use older rand version in zk-token-sdk * program-runtime: Inline random key generation * bloom: Fix clippy warnings in tests * streamer: Scope rng usage correctly * perf: Fix clippy warning * accounts-db: Map to char to generate a random string * Remove `from_secret_key_bytes`, it's just `keypair_from_seed` * ledger: Generate keypairs by hand * ed25519-tests: Use new rand * runtime: Use new rand in all tests * gossip: Clean up clippy and inline keypair generators * core: Inline keypair generation for tests * Push sbf lockfile change * sdk: Sort dependencies correctly * Remove `hash::new_with_thread_rng`, use `Hash::new_unique()` * Use Keypair::new where chacha isn't used * sdk: Fix build by marking rand 0.7 optional * Hardcode secret key length, add static assertion * Unify `getrandom` crate usage to fix linking errors * bloom: Fix tests that require a random hash * Remove some dependencies, try to unify others * Remove unnecessary uses of rand and rand_core * Update lockfiles * Add back some dependencies to reduce rebuilds * Increase max rebuilds from 14 to 15 * frozen-abi: Remove `getrandom` * Bump rebuilds to 17 * Remove getrandom from zk-token-proof
2023-08-21 10:11:21 -07:00
let mut len: usize = thread_rng().gen_range(1..128);
current_packets += len;
if current_packets > num_packets {
len -= current_packets - num_packets;
current_packets = num_packets;
}
let mut batch = PacketBatch::with_capacity(len);
batch.resize(len, Packet::default());
for packet in batch.iter_mut() {
if thread_rng().gen_ratio(1, 2) {
tx = simple_tx.clone();
} else {
tx = multi_tx.clone();
};
Packet::populate_packet(packet, None, &tx).expect("serialize request");
if thread_rng().gen_ratio((num_packets - NUM) as u32, num_packets as u32) {
packet.meta_mut().set_discard(true);
} else {
num_valid += 1;
}
}
batches.push(batch);
}
info!("num_packets: {} valid: {}", num_packets, num_valid);
let recycler = Recycler::default();
let recycler_out = Recycler::default();
// verify packets
bencher.iter(|| {
sigverify::ed25519_verify(&mut batches, &recycler, &recycler_out, false, num_packets);
})
}
#[bench]
fn bench_get_offsets(bencher: &mut Bencher) {
let tx = test_tx();
// generate packet vector
let mut batches =
2021-12-11 06:44:15 -08:00
to_packet_batches(&std::iter::repeat(tx).take(1024).collect::<Vec<_>>(), 1024);
let recycler = Recycler::default();
// verify packets
bencher.iter(|| {
let _ans = sigverify::generate_offsets(&mut batches, &recycler, false);
})
}