ethrex-p2p 17.0.0

Peer-to-peer networking (discv4/discv5, RLPx, eth, snap) for the ethrex Ethereum client
Documentation
#![allow(clippy::unwrap_used)]
use criterion::{BatchSize, Bencher, BenchmarkId, Criterion, criterion_group, criterion_main};
use ethereum_types::{H256, U256};
use ethrex_p2p::{
    rlpx::{p2p::Capability, snap::StorageSlot},
    types::Endpoint,
};
use ethrex_rlp::{decode::RLPDecode, encode::RLPEncode};
use rand::Rng;
use std::{
    hint::black_box,
    net::{IpAddr, Ipv4Addr, Ipv6Addr},
};

fn bench_decode_p2p(c: &mut Criterion) {
    let mut group = c.benchmark_group("decode_p2p");

    group.bench_function(BenchmarkId::new("Endpoint", "ipv4/1000"), |b| {
        b.iter_batched_ref(
            || {
                let mut data = Vec::with_capacity(1000);
                let mut rng = rand::thread_rng();
                for _ in 0..1000 {
                    data.push(
                        Endpoint {
                            ip: IpAddr::V4(Ipv4Addr::from_bits(rng.r#gen())),
                            udp_port: rng.r#gen(),
                            tcp_port: rng.r#gen(),
                        }
                        .encode_to_vec(),
                    );
                }
                data
            },
            |data| {
                for data in data.iter() {
                    black_box(Endpoint::decode(data).unwrap());
                }
            },
            BatchSize::SmallInput,
        );
    });
    group.bench_function(BenchmarkId::new("Endpoint", "ipv6/1000"), |b| {
        b.iter_batched_ref(
            || {
                let mut data = Vec::with_capacity(1000);
                let mut rng = rand::thread_rng();
                for _ in 0..1000 {
                    data.push(
                        Endpoint {
                            ip: IpAddr::V6(Ipv6Addr::from_bits(rng.r#gen())),
                            udp_port: rng.r#gen(),
                            tcp_port: rng.r#gen(),
                        }
                        .encode_to_vec(),
                    );
                }
                data
            },
            |data| {
                for data in data.iter() {
                    black_box(Endpoint::decode(data).unwrap());
                }
            },
            BatchSize::SmallInput,
        );
    });

    {
        fn make_bench(f: impl Fn(u8) -> Capability) -> impl Fn(&mut Bencher) {
            move |b| {
                b.iter_batched_ref(
                    || {
                        let mut data = Vec::with_capacity(1000);
                        for _ in 0..1000 {
                            data.push(f(rand::thread_rng().r#gen()).encode_to_vec());
                        }
                        data
                    },
                    |data| {
                        for data in data {
                            black_box(Capability::decode(data).unwrap());
                        }
                    },
                    BatchSize::SmallInput,
                )
            }
        }

        group.bench_function(
            BenchmarkId::new("Capability", "eth/1000"),
            make_bench(Capability::eth),
        );
        group.bench_function(
            BenchmarkId::new("Capability", "snap/1000"),
            make_bench(Capability::snap),
        );
        group.bench_function(
            BenchmarkId::new("Capability", "based/1000"),
            make_bench(Capability::based),
        );
    }

    group.bench_function(BenchmarkId::new("StorageSlot", 1000), |b| {
        b.iter_batched_ref(
            || {
                let mut data = Vec::new();
                for _ in 0..1000 {
                    data.push(
                        StorageSlot {
                            hash: H256(rand::thread_rng().r#gen()),
                            data: U256(rand::thread_rng().r#gen()),
                        }
                        .encode_to_vec(),
                    );
                }
                data
            },
            |data| {
                for data in data {
                    black_box(StorageSlot::decode(data).unwrap());
                }
            },
            BatchSize::SmallInput,
        );
    });

    group.finish();
}

criterion_group!(benches, bench_decode_p2p);
criterion_main!(benches);