add benches

This commit is contained in:
hinto.janai 2024-10-25 20:03:30 -04:00
parent a5ba54422f
commit d2b30c1cbd
No known key found for this signature in database
GPG key ID: D47CE05FA175A499
3 changed files with 72 additions and 31 deletions

View file

@ -1,5 +1,10 @@
//! This module contains benchmarks for any //! This module contains benchmarks for any
//! non-trivial/manual `epee` implementation. //!
//! - non-trivial
//! - manual
//! - common
//!
//! type with a `epee` implementation.
//! //!
//! Types with the standard `epee` derive implementation are not included. //! Types with the standard `epee` derive implementation are not included.
@ -11,29 +16,21 @@ use function_name::named;
use cuprate_epee_encoding::{from_bytes, to_bytes}; use cuprate_epee_encoding::{from_bytes, to_bytes};
use cuprate_rpc_types::bin::{GetBlocksRequest, GetBlocksResponse}; use cuprate_rpc_types::bin::{GetBlocksRequest, GetBlocksResponse};
criterion_group! { /// Create [`to_bytes`] and [`from_bytes`] benchmarks for `epee` types.
name = benches; macro_rules! generate_epee_benchmarks {
config = Criterion::default();
targets =
epee_to_bytes_get_blocks_request,
epee_from_bytes_get_blocks_request,
epee_to_bytes_get_blocks_response,
epee_from_bytes_get_blocks_response,
}
criterion_main!(benches);
/// TODO
macro_rules! impl_epee_benchmark {
( (
$( $(
$t:ty $t:ty
),* $(,)? ),* $(,)?
) => { paste::paste! { ) => { paste::paste! {
// Generate the benchmarking functions.
$( $(
#[named] #[named]
fn [<epee_from_bytes_ $t:snake>](c: &mut Criterion) { fn [<epee_from_bytes_ $t:snake>](c: &mut Criterion) {
let bytes = to_bytes($t::default()).unwrap(); let bytes = to_bytes($t::default()).unwrap();
// `iter_batched()` is used so the `Default::default()`
// is not part of the timings.
c.bench_function(function_name!(), |b| { c.bench_function(function_name!(), |b| {
b.iter_batched( b.iter_batched(
|| bytes.clone(), || bytes.clone(),
@ -56,10 +53,22 @@ macro_rules! impl_epee_benchmark {
}); });
} }
)* )*
// Enable all the benchmark functions created in this macro.
criterion_group! {
name = benches;
config = Criterion::default();
targets =
$(
[<epee_from_bytes_ $t:snake>],
[<epee_to_bytes_ $t:snake>],
)*
}
criterion_main!(benches);
}}; }};
} }
impl_epee_benchmark! { generate_epee_benchmarks! {
GetBlocksRequest, GetBlocksRequest,
GetBlocksResponse // GetBlocksResponse // TODO: fix epee impl
} }

View file

@ -1,8 +1,8 @@
//! Benchmarks for `cuprate-json-rpc`. //! Benchmarks for `cuprate-json-rpc`.
#![allow(unused_crate_dependencies)] #![allow(unused_crate_dependencies)]
mod serde;
mod epee; mod epee;
mod serde;
criterion::criterion_main! { criterion::criterion_main! {
epee::benches, epee::benches,

View file

@ -1,5 +1,10 @@
//! This module contains benchmarks for any //! This module contains benchmarks for any
//! non-trivial/manual `serde` implementation. //!
//! - non-trivial
//! - manual
//! - common
//!
//! type with a `serde` implementation.
//! //!
//! Types with the standard `serde` derive implementation are not included. //! Types with the standard `serde` derive implementation are not included.
@ -9,19 +14,21 @@ use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion
use function_name::named; use function_name::named;
use serde_json::{from_str, to_string}; use serde_json::{from_str, to_string};
use cuprate_rpc_types::misc::TxEntry; use cuprate_rpc_types::{
json::{
CalcPowRequest, GetBlockHeadersRangeResponse, GetBlockResponse, GetBlockTemplateResponse,
GetConnectionsResponse, GetInfoResponse, GetLastBlockHeaderResponse, SyncInfoResponse,
},
misc::TxEntry,
};
use cuprate_test_utils::rpc::data::json::{
CALC_POW_REQUEST, GET_BLOCK_HEADERS_RANGE_RESPONSE, GET_BLOCK_RESPONSE,
GET_BLOCK_TEMPLATE_RESPONSE, GET_CONNECTIONS_RESPONSE, GET_INFO_RESPONSE,
GET_LAST_BLOCK_HEADER_RESPONSE, SYNC_INFO_RESPONSE,
};
criterion_group! { /// Generate [`from_str`] and [`to_string`] benchmarks for `serde` types.
name = benches; macro_rules! generate_serde_benchmarks {
config = Criterion::default();
targets =
serde_from_str_tx_entry,
serde_to_string_tx_entry,
}
criterion_main!(benches);
/// TODO
macro_rules! impl_serde_benchmark {
( (
$( $(
// The type to test => // The type to test =>
@ -29,6 +36,7 @@ macro_rules! impl_serde_benchmark {
$t:ty => $t_example:expr $t:ty => $t_example:expr
),* $(,)? ),* $(,)?
) => { paste::paste! { ) => { paste::paste! {
// Generate the benchmarking functions.
$( $(
#[named] #[named]
fn [<serde_from_str_ $t:snake>](c: &mut Criterion) { fn [<serde_from_str_ $t:snake>](c: &mut Criterion) {
@ -53,11 +61,35 @@ macro_rules! impl_serde_benchmark {
); );
}); });
} }
)* )*
// Enable all the benchmark functions created in this macro.
criterion_group! {
name = benches;
config = Criterion::default();
targets =
$(
[<serde_from_str_ $t:snake>],
[<serde_to_string_ $t:snake>],
)*
}
criterion_main!(benches);
}}; }};
} }
impl_serde_benchmark! { generate_serde_benchmarks! {
// Custom serde types.
TxEntry => r#"{"as_hex":"","as_json":"","double_spend_seen":false,"prunable_as_hex":"","prunable_hash":"","pruned_as_hex":"","received_timestamp":0,"relayed":false,"tx_hash":"","in_pool":false}"#, TxEntry => r#"{"as_hex":"","as_json":"","double_spend_seen":false,"prunable_as_hex":"","prunable_hash":"","pruned_as_hex":"","received_timestamp":0,"relayed":false,"tx_hash":"","in_pool":false}"#,
// Distribution => "TODO: enable after type is finalized" // Distribution => "TODO: enable after type is finalized"
// Common types or heavy types (heap types, many fields, etc).
GetLastBlockHeaderResponse => GET_LAST_BLOCK_HEADER_RESPONSE,
CalcPowRequest => CALC_POW_REQUEST,
SyncInfoResponse => SYNC_INFO_RESPONSE,
GetInfoResponse => GET_INFO_RESPONSE,
GetBlockResponse => GET_BLOCK_RESPONSE,
GetConnectionsResponse => GET_CONNECTIONS_RESPONSE,
GetBlockTemplateResponse => GET_BLOCK_TEMPLATE_RESPONSE,
GetBlockHeadersRangeResponse => GET_BLOCK_HEADERS_RANGE_RESPONSE
} }