chore(bench): more determinism (#13603)

This commit is contained in:
DaniPopes
2024-12-31 03:42:07 +01:00
committed by GitHub
parent c253d12af7
commit 9a062c0844
9 changed files with 24 additions and 41 deletions

View File

@ -10,6 +10,7 @@ on:
env: env:
CARGO_TERM_COLOR: always CARGO_TERM_COLOR: always
BASELINE: base BASELINE: base
SEED: reth
concurrency: concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}

View File

@ -4,20 +4,12 @@ use alloy_consensus::TxEip4844;
use alloy_eips::eip4844::{ use alloy_eips::eip4844::{
env_settings::EnvKzgSettings, BlobTransactionSidecar, MAX_BLOBS_PER_BLOCK, env_settings::EnvKzgSettings, BlobTransactionSidecar, MAX_BLOBS_PER_BLOCK,
}; };
use alloy_primitives::hex;
use criterion::{ use criterion::{
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
}; };
use proptest::{ use proptest::{prelude::*, strategy::ValueTree, test_runner::TestRunner};
prelude::*,
strategy::ValueTree,
test_runner::{RngAlgorithm, TestRng, TestRunner},
};
use proptest_arbitrary_interop::arb; use proptest_arbitrary_interop::arb;
// constant seed to use for the rng
const SEED: [u8; 32] = hex!("1337133713371337133713371337133713371337133713371337133713371337");
/// Benchmarks EIP-48444 blob validation. /// Benchmarks EIP-48444 blob validation.
fn blob_validation(c: &mut Criterion) { fn blob_validation(c: &mut Criterion) {
let mut group = c.benchmark_group("Blob Transaction KZG validation"); let mut group = c.benchmark_group("Blob Transaction KZG validation");
@ -35,9 +27,7 @@ fn validate_blob_tx(
kzg_settings: EnvKzgSettings, kzg_settings: EnvKzgSettings,
) { ) {
let setup = || { let setup = || {
let config = ProptestConfig::default(); let mut runner = TestRunner::deterministic();
let rng = TestRng::from_seed(RngAlgorithm::ChaCha, &SEED);
let mut runner = TestRunner::new_with_rng(config, rng);
// generate tx and sidecar // generate tx and sidecar
let mut tx = arb::<TxEip4844>().new_tree(&mut runner).unwrap().current(); let mut tx = arb::<TxEip4844>().new_tree(&mut runner).unwrap().current();

View File

@ -1,27 +1,20 @@
#![allow(missing_docs)] #![allow(missing_docs)]
use alloy_primitives::{hex_literal::hex, Address}; use alloy_primitives::Address;
use criterion::{ use criterion::{
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
}; };
use pprof::criterion::{Output, PProfProfiler}; use pprof::criterion::{Output, PProfProfiler};
use proptest::{ use proptest::{prelude::*, strategy::ValueTree, test_runner::TestRunner};
prelude::*,
strategy::ValueTree,
test_runner::{RngAlgorithm, TestRng, TestRunner},
};
use reth_transaction_pool::{ use reth_transaction_pool::{
pool::{BasefeeOrd, ParkedPool, PendingPool, QueuedOrd}, pool::{BasefeeOrd, ParkedPool, PendingPool, QueuedOrd},
test_utils::{MockOrdering, MockTransaction, MockTransactionFactory}, test_utils::{MockOrdering, MockTransaction, MockTransactionFactory},
SubPoolLimit, SubPoolLimit,
}; };
// constant seed to use for the rng
const SEED: [u8; 32] = hex!("1337133713371337133713371337133713371337133713371337133713371337");
/// Generates a set of `depth` dependent transactions, with the specified sender. Its values are /// Generates a set of `depth` dependent transactions, with the specified sender. Its values are
/// generated using [Arbitrary]. /// generated using [Arbitrary].
fn create_transactions_for_sender( fn create_transactions_for_sender(
mut runner: TestRunner, runner: &mut TestRunner,
sender: Address, sender: Address,
depth: usize, depth: usize,
) -> Vec<MockTransaction> { ) -> Vec<MockTransaction> {
@ -32,10 +25,8 @@ fn create_transactions_for_sender(
assert!(depth > 0); assert!(depth > 0);
// make sure these are all post-eip-1559 transactions // make sure these are all post-eip-1559 transactions
let mut txs = prop::collection::vec(any::<MockTransaction>(), depth) let mut txs =
.new_tree(&mut runner) prop::collection::vec(any::<MockTransaction>(), depth).new_tree(runner).unwrap().current();
.unwrap()
.current();
for (nonce, tx) in txs.iter_mut().enumerate() { for (nonce, tx) in txs.iter_mut().enumerate() {
// reject pre-eip1559 tx types, if there is a legacy tx, replace it with an eip1559 tx // reject pre-eip1559 tx types, if there is a legacy tx, replace it with an eip1559 tx
@ -43,8 +34,8 @@ fn create_transactions_for_sender(
*tx = MockTransaction::eip1559(); *tx = MockTransaction::eip1559();
// set fee values using arbitrary // set fee values using arbitrary
tx.set_priority_fee(any::<u128>().new_tree(&mut runner).unwrap().current()); tx.set_priority_fee(any::<u128>().new_tree(runner).unwrap().current());
tx.set_max_fee(any::<u128>().new_tree(&mut runner).unwrap().current()); tx.set_max_fee(any::<u128>().new_tree(runner).unwrap().current());
} }
tx.set_sender(sender); tx.set_sender(sender);
@ -62,9 +53,7 @@ fn create_transactions_for_sender(
/// ///
/// This uses [`create_transactions_for_sender`] to generate the transactions. /// This uses [`create_transactions_for_sender`] to generate the transactions.
fn generate_many_transactions(senders: usize, max_depth: usize) -> Vec<MockTransaction> { fn generate_many_transactions(senders: usize, max_depth: usize) -> Vec<MockTransaction> {
let config = ProptestConfig::default(); let mut runner = TestRunner::deterministic();
let rng = TestRng::from_seed(RngAlgorithm::ChaCha, &SEED);
let mut runner = TestRunner::new_with_rng(config, rng);
let mut txs = Vec::with_capacity(senders); let mut txs = Vec::with_capacity(senders);
for idx in 0..senders { for idx in 0..senders {
@ -79,7 +68,7 @@ fn generate_many_transactions(senders: usize, max_depth: usize) -> Vec<MockTrans
let addr_slice = [0u8; 12].into_iter().chain(idx_slice.into_iter()).collect::<Vec<_>>(); let addr_slice = [0u8; 12].into_iter().chain(idx_slice.into_iter()).collect::<Vec<_>>();
let sender = Address::from_slice(&addr_slice); let sender = Address::from_slice(&addr_slice);
txs.extend(create_transactions_for_sender(runner.clone(), sender, depth)); txs.extend(create_transactions_for_sender(&mut runner, sender, depth));
} }
txs txs

View File

@ -2,6 +2,7 @@
use criterion::{ use criterion::{
criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, Criterion,
}; };
use prop::test_runner::TestRng;
use proptest::{ use proptest::{
prelude::*, prelude::*,
strategy::ValueTree, strategy::ValueTree,
@ -116,7 +117,8 @@ fn generate_test_data(size: usize) -> (Vec<Nibbles>, Vec<Nibbles>, Vec<bool>) {
use prop::collection::vec; use prop::collection::vec;
let config = ProptestConfig { result_cache: basic_result_cache, ..Default::default() }; let config = ProptestConfig { result_cache: basic_result_cache, ..Default::default() };
let mut runner = TestRunner::new(config); let rng = TestRng::deterministic_rng(config.rng_algorithm);
let mut runner = TestRunner::new_with_rng(config, rng);
let vec_of_nibbles = |range| vec(any_with::<Nibbles>(range), size); let vec_of_nibbles = |range| vec(any_with::<Nibbles>(range), size);
let mut preload = vec_of_nibbles(32usize.into()).new_tree(&mut runner).unwrap().current(); let mut preload = vec_of_nibbles(32usize.into()).new_tree(&mut runner).unwrap().current();

View File

@ -78,7 +78,7 @@ pub fn calculate_state_root(c: &mut Criterion) {
fn generate_test_data(size: usize) -> (HashedPostState, HashedPostState) { fn generate_test_data(size: usize) -> (HashedPostState, HashedPostState) {
let storage_size = 1_000; let storage_size = 1_000;
let mut runner = TestRunner::new(ProptestConfig::default()); let mut runner = TestRunner::deterministic();
use proptest::{collection::hash_map, sample::subsequence}; use proptest::{collection::hash_map, sample::subsequence};
let db_state = hash_map( let db_state = hash_map(

View File

@ -10,7 +10,7 @@ use reth_trie::Nibbles;
use reth_trie_sparse::RevealedSparseTrie; use reth_trie_sparse::RevealedSparseTrie;
fn update_rlp_node_level(c: &mut Criterion) { fn update_rlp_node_level(c: &mut Criterion) {
let mut rng = generators::rng_with_seed(&12345_u16.to_be_bytes()); let mut rng = generators::rng();
let mut group = c.benchmark_group("update rlp node level"); let mut group = c.benchmark_group("update rlp node level");
group.sample_size(20); group.sample_size(20);

View File

@ -169,6 +169,7 @@ fn calculate_root_from_leaves_repeated(c: &mut Criterion) {
trie_updates.finalize(hb, node_iter.walker.take_removed_keys()); trie_updates.finalize(hb, node_iter.walker.take_removed_keys());
} }
} }
(storage, storage_updates, trie_updates)
}, },
) )
}); });
@ -205,6 +206,7 @@ fn calculate_root_from_leaves_repeated(c: &mut Criterion) {
} }
sparse.root().unwrap(); sparse.root().unwrap();
} }
sparse
}, },
) )
}); });

View File

@ -51,7 +51,7 @@ fn from_bundle_state_seq(state: &HashMap<Address, BundleAccount>) -> HashedPostS
fn generate_test_data(size: usize) -> HashMap<Address, BundleAccount> { fn generate_test_data(size: usize) -> HashMap<Address, BundleAccount> {
let storage_size = 1_000; let storage_size = 1_000;
let mut runner = TestRunner::new(ProptestConfig::default()); let mut runner = TestRunner::deterministic();
use proptest::collection::hash_map; use proptest::collection::hash_map;
let state = hash_map( let state = hash_map(

View File

@ -18,8 +18,7 @@ use reth_primitives::{
use secp256k1::{Keypair, Secp256k1}; use secp256k1::{Keypair, Secp256k1};
use std::{ use std::{
cmp::{max, min}, cmp::{max, min},
collections::{hash_map::DefaultHasher, BTreeMap}, collections::BTreeMap,
hash::Hasher,
ops::{Range, RangeInclusive}, ops::{Range, RangeInclusive},
}; };
@ -77,9 +76,9 @@ pub fn rng() -> StdRng {
/// Returns a random number generator from a specific seed, as bytes. /// Returns a random number generator from a specific seed, as bytes.
pub fn rng_with_seed(seed: &[u8]) -> StdRng { pub fn rng_with_seed(seed: &[u8]) -> StdRng {
let mut hasher = DefaultHasher::new(); let mut seed_bytes = [0u8; 32];
hasher.write(seed); seed_bytes[..seed.len().min(32)].copy_from_slice(seed);
StdRng::seed_from_u64(hasher.finish()) StdRng::from_seed(seed_bytes)
} }
/// Generates a range of random [`SealedHeader`]s. /// Generates a range of random [`SealedHeader`]s.