Skip to content

Commit

Permalink
feat(mpt): TrieNode benchmarks
Browse files Browse the repository at this point in the history
## Overview

Adds criterion benchmarks for `TrieNode` operations in the `kona-mpt`
crate.
  • Loading branch information
clabby committed Jun 29, 2024
1 parent 7955af8 commit 5ba2c0d
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions crates/mpt/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,12 @@ alloy-transport-http = { version = "0.1" }
reqwest = "0.12.4"
tracing-subscriber = "0.3.18"
futures = { version = "0.3.30", default-features = false }

proptest = "1.4"
rand = "0.8.5"
criterion = { version = "0.5.1", features = ["html_reports"] }
pprof = { version = "0.13.0", features = ["criterion", "flamegraph", "frame-pointer"] }

[[bench]]
name = "trie_node"
harness = false
124 changes: 124 additions & 0 deletions crates/mpt/benches/trie_node.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
//! Contains benchmarks for the [TrieNode].
use alloy_trie::Nibbles;
use criterion::{criterion_group, criterion_main, Criterion};
use kona_mpt::{NoopTrieDBFetcher, NoopTrieDBHinter, TrieNode};
use pprof::criterion::{Output, PProfProfiler};
use rand::seq::SliceRandom;

fn trie(c: &mut Criterion) {
let mut g = c.benchmark_group("execution");
g.sample_size(10);

g.bench_function("Insertion - 4096 nodes", |b| {
let keys = (0..2usize.pow(12))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();

b.iter(|| {
let mut trie = TrieNode::Empty;
for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}
});
});

g.bench_function("Insertion - 65,536 nodes", |b| {
let keys = (0..2usize.pow(16))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();

b.iter(|| {
let mut trie = TrieNode::Empty;
for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}
});
});

g.bench_function("Delete 16 nodes - 4096 nodes", |b| {
let keys = (0..2usize.pow(12))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();
let mut trie = TrieNode::Empty;

let rng = &mut rand::thread_rng();
let keys_to_delete = keys.choose_multiple(rng, 16).cloned().collect::<Vec<_>>();

for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}

b.iter(|| {
let trie = &mut trie.clone();
for key in &keys_to_delete {
trie.delete(key, &NoopTrieDBFetcher, &NoopTrieDBHinter).unwrap();
}
});
});

g.bench_function("Delete 16 nodes - 65,536 nodes", |b| {
let keys = (0..2usize.pow(16))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();
let mut trie = TrieNode::Empty;
for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}

let rng = &mut rand::thread_rng();
let keys_to_delete = keys.choose_multiple(rng, 16).cloned().collect::<Vec<_>>();

b.iter(|| {
let trie = &mut trie.clone();
for key in &keys_to_delete {
trie.delete(key, &NoopTrieDBFetcher, &NoopTrieDBHinter).unwrap();
}
});
});

g.bench_function("Open 1024 nodes - 4096 nodes", |b| {
let keys = (0..2usize.pow(12))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();
let mut trie = TrieNode::Empty;
for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}

let rng = &mut rand::thread_rng();
let keys_to_retrieve = keys.choose_multiple(rng, 1024).cloned().collect::<Vec<_>>();

b.iter(|| {
for key in &keys_to_retrieve {
trie.open(key, &NoopTrieDBFetcher).unwrap();
}
});
});

g.bench_function("Open 1024 nodes - 65,536 nodes", |b| {
let keys = (0..2usize.pow(16))
.map(|_| Nibbles::unpack(rand::random::<[u8; 32]>()))
.collect::<Vec<_>>();
let mut trie = TrieNode::Empty;
for key in &keys {
trie.insert(key, key.to_vec().into(), &NoopTrieDBFetcher).unwrap();
}

let rng = &mut rand::thread_rng();
let keys_to_retrieve = keys.choose_multiple(rng, 1024).cloned().collect::<Vec<_>>();

b.iter(|| {
for key in &keys_to_retrieve {
trie.open(key, &NoopTrieDBFetcher).unwrap();
}
});
});
}

criterion_group! {
name = trie_benches;
config = Criterion::default().with_profiler(PProfProfiler::new(100, Output::Flamegraph(None)));
targets = trie
}
criterion_main!(trie_benches);

0 comments on commit 5ba2c0d

Please sign in to comment.