mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
chore(bench): more determinism (#13603)
This commit is contained in:
1
.github/workflows/bench.yml
vendored
1
.github/workflows/bench.yml
vendored
@ -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 }}
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user