Skip to content

Commit c557336

Browse files
Add benchmarks for SSZ encoding/decoding (#58)
* Add benchmarks for SSZ encoding/decoding * Fix doctests due to SSZ bitfield changes
1 parent 10d63e4 commit c557336

File tree

3 files changed

+102
-2
lines changed

3 files changed

+102
-2
lines changed

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,14 @@ itertools = "0.14.0"
2323
derivative = "2"
2424

2525
[dev-dependencies]
26+
criterion = "0.7.0"
2627
serde_json = "1.0.0"
2728
tree_hash_derive = "0.10.0"
29+
30+
[[bench]]
31+
harness = false
32+
name = "encode_decode"
33+
34+
# FIXME: remove before release
35+
[patch.crates-io]
36+
ethereum_ssz = { git = "https://github.com/sigp/ethereum_ssz", branch = "main" }

benches/encode_decode.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
use criterion::{criterion_group, criterion_main, Criterion};
2+
use ssz::{Decode, Encode};
3+
use ssz_types::{FixedVector, VariableList};
4+
use std::hint::black_box;
5+
use std::time::Duration;
6+
use typenum::{U1048576, U131072};
7+
8+
fn benchmark_fixed_vector(c: &mut Criterion) {
9+
let mut group = c.benchmark_group("fixed_vector");
10+
11+
let fixed_vector_u8 = FixedVector::<u8, U1048576>::new(vec![255u8; 1048576]).unwrap();
12+
let fixed_vector_u64 = FixedVector::<u64, U131072>::new(vec![255u64; 131072]).unwrap();
13+
let fixed_vector_bytes = fixed_vector_u8.as_ssz_bytes();
14+
15+
group.warm_up_time(Duration::from_secs(15));
16+
group.measurement_time(Duration::from_secs(10));
17+
18+
group.bench_function("decode_u8_1m", |b| {
19+
b.iter(|| {
20+
let vector = FixedVector::<u8, U1048576>::from_ssz_bytes(&fixed_vector_bytes).unwrap();
21+
black_box(vector);
22+
});
23+
});
24+
25+
group.bench_function("encode_u8_1m", |b| {
26+
b.iter(|| {
27+
let bytes = fixed_vector_u8.as_ssz_bytes();
28+
black_box(bytes);
29+
});
30+
});
31+
32+
group.bench_function("decode_u64_128k", |b| {
33+
b.iter(|| {
34+
let vector = FixedVector::<u64, U131072>::from_ssz_bytes(&fixed_vector_bytes).unwrap();
35+
black_box(vector);
36+
});
37+
});
38+
group.bench_function("encode_u64_128k", |b| {
39+
b.iter(|| {
40+
let bytes = fixed_vector_u64.as_ssz_bytes();
41+
black_box(bytes);
42+
});
43+
});
44+
45+
group.finish();
46+
}
47+
48+
fn benchmark_variable_list(c: &mut Criterion) {
49+
let mut group = c.benchmark_group("variable_list");
50+
51+
let variable_list_u8 = VariableList::<u8, U1048576>::new(vec![255u8; 1048576]).unwrap();
52+
let variable_list_u64 = VariableList::<u64, U131072>::new(vec![255u64; 131072]).unwrap();
53+
let variable_list_bytes = variable_list_u8.as_ssz_bytes();
54+
55+
group.warm_up_time(Duration::from_secs(15));
56+
group.measurement_time(Duration::from_secs(10));
57+
58+
group.bench_function("decode_u8_1m", |b| {
59+
b.iter(|| {
60+
let vector =
61+
VariableList::<u8, U1048576>::from_ssz_bytes(&variable_list_bytes).unwrap();
62+
black_box(vector);
63+
});
64+
});
65+
66+
group.bench_function("encode_u8_1m", |b| {
67+
b.iter(|| {
68+
let bytes = variable_list_u8.as_ssz_bytes();
69+
black_box(bytes);
70+
});
71+
});
72+
73+
group.bench_function("decode_u64_128k", |b| {
74+
b.iter(|| {
75+
let vector =
76+
VariableList::<u64, U131072>::from_ssz_bytes(&variable_list_bytes).unwrap();
77+
black_box(vector);
78+
});
79+
});
80+
group.bench_function("encode_u64_128k", |b| {
81+
b.iter(|| {
82+
let bytes = variable_list_u64.as_ssz_bytes();
83+
black_box(bytes);
84+
});
85+
});
86+
87+
group.finish();
88+
}
89+
90+
criterion_group!(benches, benchmark_fixed_vector, benchmark_variable_list);
91+
criterion_main!(benches);

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
//! }
2525
//!
2626
//! let mut example = Example {
27-
//! bit_vector: Bitfield::new(),
28-
//! bit_list: Bitfield::with_capacity(4).unwrap(),
27+
//! bit_vector: BitVector::new(),
28+
//! bit_list: BitList::with_capacity(4).unwrap(),
2929
//! variable_list: VariableList::try_from(vec![0, 1]).unwrap(),
3030
//! fixed_vector: FixedVector::try_from(vec![2, 3, 4, 5, 6, 7, 8, 9]).unwrap(),
3131
//! };

0 commit comments

Comments
 (0)