improves sigverify discard_excess_packets performance (#22577)
As shown by the added benchmark, current code does worse if there is a spam address plus a lot of unique addresses. on current master: test bench_packet_discard_many_senders ... bench: 1,997,960 ns/iter (+/- 103,715) test bench_packet_discard_mixed_senders ... bench: 14,256,116 ns/iter (+/- 534,865) test bench_packet_discard_single_sender ... bench: 1,306,809 ns/iter (+/- 61,992) with this commit: test bench_packet_discard_many_senders ... bench: 1,644,025 ns/iter (+/- 83,715) test bench_packet_discard_mixed_senders ... bench: 1,089,789 ns/iter (+/- 86,324) test bench_packet_discard_single_sender ... bench: 955,234 ns/iter (+/- 55,953)
This commit is contained in:
@ -49,11 +49,16 @@ fn run_bench_packet_discard(num_ips: usize, bencher: &mut Bencher) {
|
||||
|
||||
bencher.iter(move || {
|
||||
SigVerifyStage::discard_excess_packets(&mut batches, 10_000);
|
||||
let mut num_packets = 0;
|
||||
for batch in batches.iter_mut() {
|
||||
for p in batch.packets.iter_mut() {
|
||||
if !p.meta.discard() {
|
||||
num_packets += 1;
|
||||
}
|
||||
p.meta.set_discard(false);
|
||||
}
|
||||
}
|
||||
assert_eq!(num_packets, 10_000);
|
||||
});
|
||||
}
|
||||
|
||||
@ -67,6 +72,43 @@ fn bench_packet_discard_single_sender(bencher: &mut Bencher) {
|
||||
run_bench_packet_discard(1, bencher);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_packet_discard_mixed_senders(bencher: &mut Bencher) {
|
||||
const SIZE: usize = 30 * 1000;
|
||||
const CHUNK_SIZE: usize = 1024;
|
||||
fn new_rand_addr<R: Rng>(rng: &mut R) -> std::net::IpAddr {
|
||||
let mut addr = [0u16; 8];
|
||||
rng.fill(&mut addr);
|
||||
std::net::IpAddr::from(addr)
|
||||
}
|
||||
let mut rng = thread_rng();
|
||||
let mut batches = to_packet_batches(&vec![test_tx(); SIZE], CHUNK_SIZE);
|
||||
let spam_addr = new_rand_addr(&mut rng);
|
||||
for batch in batches.iter_mut() {
|
||||
for packet in batch.packets.iter_mut() {
|
||||
// One spam address, ~1000 unique addresses.
|
||||
packet.meta.addr = if rng.gen_ratio(1, 30) {
|
||||
new_rand_addr(&mut rng)
|
||||
} else {
|
||||
spam_addr
|
||||
}
|
||||
}
|
||||
}
|
||||
bencher.iter(move || {
|
||||
SigVerifyStage::discard_excess_packets(&mut batches, 10_000);
|
||||
let mut num_packets = 0;
|
||||
for batch in batches.iter_mut() {
|
||||
for packet in batch.packets.iter_mut() {
|
||||
if !packet.meta.discard() {
|
||||
num_packets += 1;
|
||||
}
|
||||
packet.meta.set_discard(false);
|
||||
}
|
||||
}
|
||||
assert_eq!(num_packets, 10_000);
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn bench_sigverify_stage(bencher: &mut Bencher) {
|
||||
solana_logger::setup();
|
||||
|
Reference in New Issue
Block a user