From 5629ba0bb117e107e3811f8dc0fda0c03796f508 Mon Sep 17 00:00:00 2001 From: Ragnar Date: Mon, 30 Dec 2024 22:11:27 +0100 Subject: [PATCH] feat(bench): make benchmark inputs deterministic using fixed seed (#13586) Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com> --- crates/trie/sparse/benches/rlp_node.rs | 5 ++--- crates/trie/sparse/benches/root.rs | 2 +- crates/trie/trie/benches/trie_root.rs | 2 +- testing/testing-utils/src/generators.rs | 11 ++++++++--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/crates/trie/sparse/benches/rlp_node.rs b/crates/trie/sparse/benches/rlp_node.rs index 25d4e64af..ac60f562b 100644 --- a/crates/trie/sparse/benches/rlp_node.rs +++ b/crates/trie/sparse/benches/rlp_node.rs @@ -10,13 +10,12 @@ use reth_trie::Nibbles; use reth_trie_sparse::RevealedSparseTrie; fn update_rlp_node_level(c: &mut Criterion) { - let mut rng = generators::rng(); - + let mut rng = generators::rng_with_seed(&12345_u16.to_be_bytes()); let mut group = c.benchmark_group("update rlp node level"); group.sample_size(20); for size in [100_000] { - let mut runner = TestRunner::new(ProptestConfig::default()); + let mut runner = TestRunner::deterministic(); let state = proptest::collection::hash_map(any::(), any::(), size) .new_tree(&mut runner) .unwrap() diff --git a/crates/trie/sparse/benches/root.rs b/crates/trie/sparse/benches/root.rs index 9e9d2aec1..456cc2a78 100644 --- a/crates/trie/sparse/benches/root.rs +++ b/crates/trie/sparse/benches/root.rs @@ -214,7 +214,7 @@ fn calculate_root_from_leaves_repeated(c: &mut Criterion) { } fn generate_test_data(size: usize) -> B256HashMap { - let mut runner = TestRunner::new(ProptestConfig::default()); + let mut runner = TestRunner::deterministic(); proptest::collection::hash_map(any::(), any::(), size) .new_tree(&mut runner) .unwrap() diff --git a/crates/trie/trie/benches/trie_root.rs b/crates/trie/trie/benches/trie_root.rs index 840edd32d..5c93abc8a 100644 --- a/crates/trie/trie/benches/trie_root.rs +++ b/crates/trie/trie/benches/trie_root.rs @@ -30,7 +30,7 @@ pub fn trie_root_benchmark(c: &mut Criterion) { fn generate_test_data(size: usize) -> Vec> { prop::collection::vec(arb::>(), size) - .new_tree(&mut TestRunner::new(ProptestConfig::default())) + .new_tree(&mut TestRunner::deterministic()) .unwrap() .current() } diff --git a/testing/testing-utils/src/generators.rs b/testing/testing-utils/src/generators.rs index 28ba171bd..bcaeeb81b 100644 --- a/testing/testing-utils/src/generators.rs +++ b/testing/testing-utils/src/generators.rs @@ -69,14 +69,19 @@ impl Default for BlockRangeParams { /// If `SEED` is not set, a random seed is used. pub fn rng() -> StdRng { if let Ok(seed) = std::env::var("SEED") { - let mut hasher = DefaultHasher::new(); - hasher.write(seed.as_bytes()); - StdRng::seed_from_u64(hasher.finish()) + rng_with_seed(seed.as_bytes()) } else { StdRng::from_rng(thread_rng()).expect("could not build rng") } } +/// Returns a random number generator from a specific seed, as bytes. +pub fn rng_with_seed(seed: &[u8]) -> StdRng { + let mut hasher = DefaultHasher::new(); + hasher.write(seed); + StdRng::seed_from_u64(hasher.finish()) +} + /// Generates a range of random [`SealedHeader`]s. /// /// The parent hash of the first header