From ae9513f00a8f5e905fa1f7b8f42b709ff24369ba Mon Sep 17 00:00:00 2001 From: HaoranYi Date: Thu, 26 May 2022 09:06:53 -0500 Subject: [PATCH] Opt: optimize dedup hash filter reset (#25555) * refactor compute_hash * optimize dedup filter reset * clippy * clippy2 * Revert "refactor compute_hash" This reverts commit 4d09ad07f71c8cd634d405876ae8139a5e7a121a. --- perf/benches/reset.rs | 46 +++++++++++++++++++++++++++++++++++++++++++ perf/src/sigverify.rs | 6 +++--- 2 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 perf/benches/reset.rs diff --git a/perf/benches/reset.rs b/perf/benches/reset.rs new file mode 100644 index 000000000..caa2f143b --- /dev/null +++ b/perf/benches/reset.rs @@ -0,0 +1,46 @@ +#![feature(test)] + +extern crate test; + +use { + std::sync::atomic::{AtomicU64, Ordering}, + test::Bencher, +}; + +const N: usize = 1_000_000; + +// test bench_reset1 ... bench: 436,240 ns/iter (+/- 176,714) +// test bench_reset2 ... bench: 274,007 ns/iter (+/- 129,552) + +#[bench] +fn bench_reset1(bencher: &mut Bencher) { + solana_logger::setup(); + + let mut v = Vec::with_capacity(N); + v.resize_with(N, AtomicU64::default); + + bencher.iter(|| { + test::black_box({ + for i in &v { + i.store(0, Ordering::Relaxed); + } + 0 + }); + }); +} + +#[bench] +fn bench_reset2(bencher: &mut Bencher) { + solana_logger::setup(); + + let mut v = Vec::with_capacity(N); + v.resize_with(N, AtomicU64::default); + + bencher.iter(|| { + test::black_box({ + v.clear(); + v.resize_with(N, AtomicU64::default); + 0 + }); + }); +} diff --git a/perf/src/sigverify.rs b/perf/src/sigverify.rs index 592ce310c..104932a6f 100644 --- a/perf/src/sigverify.rs +++ b/perf/src/sigverify.rs @@ -476,9 +476,9 @@ impl Deduper { //false positive rate is 1/1000 at that point let saturated = self.saturated.load(Ordering::Relaxed); if saturated || now.duration_since(self.age) > self.max_age { - for i in &self.filter { - i.store(0, Ordering::Relaxed); - } + let len = self.filter.len(); + self.filter.clear(); + self.filter.resize_with(len, AtomicU64::default); self.seed = thread_rng().gen(); self.age = now; self.saturated.store(false, Ordering::Relaxed);