Dedup bloom filter is too slow (#22607)
* Faster dedup * use ahash * fixup * single threaded * use duration type * remove the count * fixup
This commit is contained in:
committed by
GitHub
parent
6d5bbca630
commit
d6011ba14d
@ -5,14 +5,16 @@ extern crate test;
|
||||
|
||||
use {
|
||||
rand::prelude::*,
|
||||
solana_bloom::bloom::{AtomicBloom, Bloom},
|
||||
solana_perf::{
|
||||
packet::{to_packet_batches, PacketBatch},
|
||||
sigverify,
|
||||
},
|
||||
std::time::Duration,
|
||||
test::Bencher,
|
||||
};
|
||||
|
||||
const NUM: usize = 4096;
|
||||
|
||||
fn test_packet_with_size(size: usize, rng: &mut ThreadRng) -> Vec<u8> {
|
||||
// subtract 8 bytes because the length will get serialized as well
|
||||
(0..size.checked_sub(8).unwrap())
|
||||
@ -22,20 +24,14 @@ fn test_packet_with_size(size: usize, rng: &mut ThreadRng) -> Vec<u8> {
|
||||
|
||||
fn do_bench_dedup_packets(bencher: &mut Bencher, mut batches: Vec<PacketBatch>) {
|
||||
// verify packets
|
||||
let mut bloom: AtomicBloom<&[u8]> = Bloom::random(1_000_000, 0.0001, 8 << 22).into();
|
||||
let mut deduper = sigverify::Deduper::new(1_000_000, Duration::from_millis(2_000));
|
||||
bencher.iter(|| {
|
||||
// bench
|
||||
sigverify::dedup_packets(&bloom, &mut batches);
|
||||
|
||||
// reset
|
||||
bloom.clear_for_tests();
|
||||
batches.iter_mut().for_each(|batch| {
|
||||
batch
|
||||
.packets
|
||||
.iter_mut()
|
||||
.for_each(|p| p.meta.set_discard(false))
|
||||
});
|
||||
})
|
||||
let _ans = deduper.dedup_packets(&mut batches);
|
||||
deduper.reset();
|
||||
batches
|
||||
.iter_mut()
|
||||
.for_each(|b| b.packets.iter_mut().for_each(|p| p.meta.set_discard(false)));
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
@ -46,7 +42,7 @@ fn bench_dedup_same_small_packets(bencher: &mut Bencher) {
|
||||
|
||||
let batches = to_packet_batches(
|
||||
&std::iter::repeat(small_packet)
|
||||
.take(4096)
|
||||
.take(NUM)
|
||||
.collect::<Vec<_>>(),
|
||||
128,
|
||||
);
|
||||
@ -61,7 +57,7 @@ fn bench_dedup_same_big_packets(bencher: &mut Bencher) {
|
||||
let big_packet = test_packet_with_size(1024, &mut rng);
|
||||
|
||||
let batches = to_packet_batches(
|
||||
&std::iter::repeat(big_packet).take(4096).collect::<Vec<_>>(),
|
||||
&std::iter::repeat(big_packet).take(NUM).collect::<Vec<_>>(),
|
||||
128,
|
||||
);
|
||||
|
||||
@ -74,7 +70,7 @@ fn bench_dedup_diff_small_packets(bencher: &mut Bencher) {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
let batches = to_packet_batches(
|
||||
&(0..4096)
|
||||
&(0..NUM)
|
||||
.map(|_| test_packet_with_size(128, &mut rng))
|
||||
.collect::<Vec<_>>(),
|
||||
128,
|
||||
@ -89,7 +85,7 @@ fn bench_dedup_diff_big_packets(bencher: &mut Bencher) {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
let batches = to_packet_batches(
|
||||
&(0..4096)
|
||||
&(0..NUM)
|
||||
.map(|_| test_packet_with_size(1024, &mut rng))
|
||||
.collect::<Vec<_>>(),
|
||||
128,
|
||||
@ -97,3 +93,27 @@ fn bench_dedup_diff_big_packets(bencher: &mut Bencher) {
|
||||
|
||||
do_bench_dedup_packets(bencher, batches);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_dedup_baseline(bencher: &mut Bencher) {
|
||||
let mut rng = rand::thread_rng();
|
||||
|
||||
let batches = to_packet_batches(
|
||||
&(0..0)
|
||||
.map(|_| test_packet_with_size(128, &mut rng))
|
||||
.collect::<Vec<_>>(),
|
||||
128,
|
||||
);
|
||||
|
||||
do_bench_dedup_packets(bencher, batches);
|
||||
}
|
||||
|
||||
#[bench]
|
||||
#[ignore]
|
||||
fn bench_dedup_reset(bencher: &mut Bencher) {
|
||||
let mut deduper = sigverify::Deduper::new(1_000_000, Duration::from_millis(0));
|
||||
bencher.iter(|| {
|
||||
deduper.reset();
|
||||
});
|
||||
}
|
||||
|
Reference in New Issue
Block a user