Skip to content

Commit 9a062c0

Browse files
authored
chore(bench): more determinism (#13603)
1 parent c253d12 commit 9a062c0

File tree

9 files changed

+24
-41
lines changed

9 files changed

+24
-41
lines changed

.github/workflows/bench.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ on:
1010
env:
1111
CARGO_TERM_COLOR: always
1212
BASELINE: base
13+
SEED: reth
1314

1415
concurrency:
1516
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}

crates/primitives/benches/validate_blob_tx.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,12 @@ use alloy_consensus::TxEip4844;
44
use alloy_eips::eip4844::{
55
env_settings::EnvKzgSettings, BlobTransactionSidecar, MAX_BLOBS_PER_BLOCK,
66
};
7-
use alloy_primitives::hex;
87
use criterion::{
98
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
109
};
11-
use proptest::{
12-
prelude::*,
13-
strategy::ValueTree,
14-
test_runner::{RngAlgorithm, TestRng, TestRunner},
15-
};
10+
use proptest::{prelude::*, strategy::ValueTree, test_runner::TestRunner};
1611
use proptest_arbitrary_interop::arb;
1712

18-
// constant seed to use for the rng
19-
const SEED: [u8; 32] = hex!("1337133713371337133713371337133713371337133713371337133713371337");
20-
2113
/// Benchmarks EIP-48444 blob validation.
2214
fn blob_validation(c: &mut Criterion) {
2315
let mut group = c.benchmark_group("Blob Transaction KZG validation");
@@ -35,9 +27,7 @@ fn validate_blob_tx(
3527
kzg_settings: EnvKzgSettings,
3628
) {
3729
let setup = || {
38-
let config = ProptestConfig::default();
39-
let rng = TestRng::from_seed(RngAlgorithm::ChaCha, &SEED);
40-
let mut runner = TestRunner::new_with_rng(config, rng);
30+
let mut runner = TestRunner::deterministic();
4131

4232
// generate tx and sidecar
4333
let mut tx = arb::<TxEip4844>().new_tree(&mut runner).unwrap().current();

crates/transaction-pool/benches/truncate.rs

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
#![allow(missing_docs)]
2-
use alloy_primitives::{hex_literal::hex, Address};
2+
use alloy_primitives::Address;
33
use criterion::{
44
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
55
};
66
use pprof::criterion::{Output, PProfProfiler};
7-
use proptest::{
8-
prelude::*,
9-
strategy::ValueTree,
10-
test_runner::{RngAlgorithm, TestRng, TestRunner},
11-
};
7+
use proptest::{prelude::*, strategy::ValueTree, test_runner::TestRunner};
128
use reth_transaction_pool::{
139
pool::{BasefeeOrd, ParkedPool, PendingPool, QueuedOrd},
1410
test_utils::{MockOrdering, MockTransaction, MockTransactionFactory},
1511
SubPoolLimit,
1612
};
1713

18-
// constant seed to use for the rng
19-
const SEED: [u8; 32] = hex!("1337133713371337133713371337133713371337133713371337133713371337");
20-
2114
/// Generates a set of `depth` dependent transactions, with the specified sender. Its values are
2215
/// generated using [Arbitrary].
2316
fn create_transactions_for_sender(
24-
mut runner: TestRunner,
17+
runner: &mut TestRunner,
2518
sender: Address,
2619
depth: usize,
2720
) -> Vec<MockTransaction> {
@@ -32,19 +25,17 @@ fn create_transactions_for_sender(
3225
assert!(depth > 0);
3326

3427
// make sure these are all post-eip-1559 transactions
35-
let mut txs = prop::collection::vec(any::<MockTransaction>(), depth)
36-
.new_tree(&mut runner)
37-
.unwrap()
38-
.current();
28+
let mut txs =
29+
prop::collection::vec(any::<MockTransaction>(), depth).new_tree(runner).unwrap().current();
3930

4031
for (nonce, tx) in txs.iter_mut().enumerate() {
4132
// reject pre-eip1559 tx types, if there is a legacy tx, replace it with an eip1559 tx
4233
if tx.is_legacy() || tx.is_eip2930() {
4334
*tx = MockTransaction::eip1559();
4435

4536
// set fee values using arbitrary
46-
tx.set_priority_fee(any::<u128>().new_tree(&mut runner).unwrap().current());
47-
tx.set_max_fee(any::<u128>().new_tree(&mut runner).unwrap().current());
37+
tx.set_priority_fee(any::<u128>().new_tree(runner).unwrap().current());
38+
tx.set_max_fee(any::<u128>().new_tree(runner).unwrap().current());
4839
}
4940

5041
tx.set_sender(sender);
@@ -62,9 +53,7 @@ fn create_transactions_for_sender(
6253
///
6354
/// This uses [`create_transactions_for_sender`] to generate the transactions.
6455
fn generate_many_transactions(senders: usize, max_depth: usize) -> Vec<MockTransaction> {
65-
let config = ProptestConfig::default();
66-
let rng = TestRng::from_seed(RngAlgorithm::ChaCha, &SEED);
67-
let mut runner = TestRunner::new_with_rng(config, rng);
56+
let mut runner = TestRunner::deterministic();
6857

6958
let mut txs = Vec::with_capacity(senders);
7059
for idx in 0..senders {
@@ -79,7 +68,7 @@ fn generate_many_transactions(senders: usize, max_depth: usize) -> Vec<MockTrans
7968
let addr_slice = [0u8; 12].into_iter().chain(idx_slice.into_iter()).collect::<Vec<_>>();
8069

8170
let sender = Address::from_slice(&addr_slice);
82-
txs.extend(create_transactions_for_sender(runner.clone(), sender, depth));
71+
txs.extend(create_transactions_for_sender(&mut runner, sender, depth));
8372
}
8473

8574
txs

crates/trie/common/benches/prefix_set.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
use criterion::{
33
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
44
};
5+
use prop::test_runner::TestRng;
56
use proptest::{
67
prelude::*,
78
strategy::ValueTree,
@@ -116,7 +117,8 @@ fn generate_test_data(size: usize) -> (Vec<Nibbles>, Vec<Nibbles>, Vec<bool>) {
116117
use prop::collection::vec;
117118

118119
let config = ProptestConfig { result_cache: basic_result_cache, ..Default::default() };
119-
let mut runner = TestRunner::new(config);
120+
let rng = TestRng::deterministic_rng(config.rng_algorithm);
121+
let mut runner = TestRunner::new_with_rng(config, rng);
120122

121123
let vec_of_nibbles = |range| vec(any_with::<Nibbles>(range), size);
122124
let mut preload = vec_of_nibbles(32usize.into()).new_tree(&mut runner).unwrap().current();

crates/trie/parallel/benches/root.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub fn calculate_state_root(c: &mut Criterion) {
7878

7979
fn generate_test_data(size: usize) -> (HashedPostState, HashedPostState) {
8080
let storage_size = 1_000;
81-
let mut runner = TestRunner::new(ProptestConfig::default());
81+
let mut runner = TestRunner::deterministic();
8282

8383
use proptest::{collection::hash_map, sample::subsequence};
8484
let db_state = hash_map(

crates/trie/sparse/benches/rlp_node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use reth_trie::Nibbles;
1010
use reth_trie_sparse::RevealedSparseTrie;
1111

1212
fn update_rlp_node_level(c: &mut Criterion) {
13-
let mut rng = generators::rng_with_seed(&12345_u16.to_be_bytes());
13+
let mut rng = generators::rng();
1414
let mut group = c.benchmark_group("update rlp node level");
1515
group.sample_size(20);
1616

crates/trie/sparse/benches/root.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ fn calculate_root_from_leaves_repeated(c: &mut Criterion) {
169169
trie_updates.finalize(hb, node_iter.walker.take_removed_keys());
170170
}
171171
}
172+
(storage, storage_updates, trie_updates)
172173
},
173174
)
174175
});
@@ -205,6 +206,7 @@ fn calculate_root_from_leaves_repeated(c: &mut Criterion) {
205206
}
206207
sparse.root().unwrap();
207208
}
209+
sparse
208210
},
209211
)
210212
});

crates/trie/trie/benches/hash_post_state.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ fn from_bundle_state_seq(state: &HashMap<Address, BundleAccount>) -> HashedPostS
5151

5252
fn generate_test_data(size: usize) -> HashMap<Address, BundleAccount> {
5353
let storage_size = 1_000;
54-
let mut runner = TestRunner::new(ProptestConfig::default());
54+
let mut runner = TestRunner::deterministic();
5555

5656
use proptest::collection::hash_map;
5757
let state = hash_map(

testing/testing-utils/src/generators.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ use reth_primitives::{
1818
use secp256k1::{Keypair, Secp256k1};
1919
use std::{
2020
cmp::{max, min},
21-
collections::{hash_map::DefaultHasher, BTreeMap},
22-
hash::Hasher,
21+
collections::BTreeMap,
2322
ops::{Range, RangeInclusive},
2423
};
2524

@@ -77,9 +76,9 @@ pub fn rng() -> StdRng {
7776

7877
/// Returns a random number generator from a specific seed, as bytes.
7978
pub fn rng_with_seed(seed: &[u8]) -> StdRng {
80-
let mut hasher = DefaultHasher::new();
81-
hasher.write(seed);
82-
StdRng::seed_from_u64(hasher.finish())
79+
let mut seed_bytes = [0u8; 32];
80+
seed_bytes[..seed.len().min(32)].copy_from_slice(seed);
81+
StdRng::from_seed(seed_bytes)
8382
}
8483

8584
/// Generates a range of random [`SealedHeader`]s.

0 commit comments

Comments
 (0)