Skip to content

Commit d3a91fc

Browse files
committed
Add benchmark for immutable digester
1 parent 9a04f56 commit d3a91fc

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-common/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ repository = { workspace = true }
1111
[lib]
1212
crate-type = ["lib", "cdylib", "staticlib"]
1313

14+
[[bench]]
15+
name = "digester"
16+
harness = false
17+
1418
[dependencies]
1519
async-trait = "0.1.52"
1620
bech32 = "0.9.1"
@@ -53,6 +57,7 @@ mithril-stm = { path = "../mithril-stm" }
5357
mithril-stm = { path = "../mithril-stm", default-features = false, features = ["num-integer-backend"] }
5458

5559
[dev-dependencies]
60+
criterion = { version = "0.4.0", features = ["html_reports", "async_tokio"] }
5661
slog-async = "2.7.0"
5762
slog-scope = "4.4.0"
5863
slog-term = "2.9.0"

mithril-common/benches/digester.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use mithril_common::{
3+
digesters::cache::{ImmutableFileDigestCacheProvider, JsonImmutableFileDigestCacheProvider},
4+
digesters::{
5+
cache::MemoryImmutableFileDigestCacheProvider, CardanoImmutableDigester, ImmutableDigester,
6+
},
7+
entities::{Beacon, ImmutableFileNumber},
8+
};
9+
use slog::Drain;
10+
use std::{
11+
fs,
12+
fs::File,
13+
io::prelude::Write,
14+
path::{Path, PathBuf},
15+
sync::Arc,
16+
};
17+
18+
fn temp_dir() -> PathBuf {
19+
std::env::temp_dir()
20+
.join("mithril_benches")
21+
.join("digester")
22+
}
23+
24+
fn db_dir() -> PathBuf {
25+
temp_dir().join("db").join("immutable")
26+
}
27+
28+
fn create_db(dir: &Path, number_of_immutables: ImmutableFileNumber, file_size: u64) {
29+
if dir.exists() {
30+
fs::remove_dir_all(dir).unwrap_or_else(|e| panic!("Could not remove dir {:?}: {}", dir, e));
31+
}
32+
fs::create_dir_all(dir).unwrap_or_else(|e| panic!("Could not create dir {:?}: {}", dir, e));
33+
34+
// + 1 to simulate "in-progress" immutable trio.
35+
for filename in (1..=(number_of_immutables + 1)).flat_map(|i| {
36+
[
37+
format!("{:05}.chunk", i),
38+
format!("{:05}.primary", i),
39+
format!("{:05}.secondary", i),
40+
]
41+
}) {
42+
let file = dir.join(Path::new(&filename));
43+
let mut source_file = File::create(file).unwrap();
44+
45+
write!(source_file, "This is a test file named '{}'", filename).unwrap();
46+
writeln!(source_file).unwrap();
47+
source_file.set_len(file_size).unwrap();
48+
}
49+
}
50+
51+
#[inline]
52+
fn create_logger() -> slog::Logger {
53+
let drain = slog_async::Async::new(slog::Discard).build().fuse();
54+
slog::Logger::root(Arc::new(drain), slog::o!())
55+
}
56+
57+
#[inline]
58+
async fn compute_digest(
59+
cache_provider: Option<Arc<dyn ImmutableFileDigestCacheProvider>>,
60+
number_of_immutables: ImmutableFileNumber,
61+
) {
62+
let digester = CardanoImmutableDigester::new(db_dir(), cache_provider, create_logger());
63+
digester
64+
.compute_digest(&Beacon::new("devnet".to_string(), 1, number_of_immutables))
65+
.await
66+
.expect("digest computation should not fail");
67+
}
68+
69+
fn criterion_benchmark(c: &mut Criterion) {
70+
let runtime = tokio::runtime::Runtime::new().unwrap();
71+
let number_of_immutable = 25;
72+
create_db(&db_dir(), number_of_immutable, 65536 * 4);
73+
74+
c.bench_function("digester no cache", |bencher| {
75+
bencher
76+
.to_async(&runtime)
77+
.iter(|| async { compute_digest(None, number_of_immutable).await })
78+
});
79+
c.bench_function("digester memory cache", |bencher| {
80+
let cache = Arc::new(MemoryImmutableFileDigestCacheProvider::default());
81+
82+
bencher
83+
.to_async(&runtime)
84+
.iter(|| async { compute_digest(Some(cache.clone()), number_of_immutable).await })
85+
});
86+
c.bench_function("digester json cache", |bencher| {
87+
let cache = Arc::new(JsonImmutableFileDigestCacheProvider::new(
88+
&temp_dir().join("immutable-cache-store.json"),
89+
));
90+
91+
bencher
92+
.to_async(&runtime)
93+
.iter(|| async { compute_digest(Some(cache.clone()), number_of_immutable).await })
94+
});
95+
}
96+
97+
criterion_group!(benches, criterion_benchmark);
98+
criterion_main!(benches);

0 commit comments

Comments
 (0)