bitbelay_cli/commands/
performance.rs

1//! A command for running the speed test suite.
2
3use std::fmt::Debug;
4use std::hash::BuildHasher;
5use std::num::NonZeroUsize;
6
7use anyhow::anyhow;
8use bitbelay_providers::Provider;
9use bitbelay_report::Config;
10use bitbelay_suites::performance;
11use bitbelay_suites::r#trait::Suite as _;
12use byte_unit::Byte;
13
14/// Arguments for the avalanche command.
15#[derive(clap::Args, Debug)]
16pub struct Args {
17    /// The amount of data to generate.
18    #[clap(short, long, default_value = "10 MB")]
19    data_size: String,
20
21    /// The number of iterations to complete.
22    #[arg(short, long, default_value_t = 1 << 8)]
23    iterations: usize,
24
25    /// The threshold needed for the speed test to pass in megabytes per second.
26    #[arg(short, long, default_value_t = 1000.0)]
27    threshold: f64,
28}
29
30/// The main function for the speed command.
31pub fn main<H: BuildHasher>(
32    args: Args,
33    build_hasher: H,
34    provider: Box<dyn Provider>,
35) -> anyhow::Result<()> {
36    tracing::info!("Starting speed test suite.");
37
38    let iterations = NonZeroUsize::try_from(args.iterations)
39        .map_err(|_| anyhow!("--iterations must be non-zero!"))?;
40
41    let desired_data_size = args
42        .data_size
43        .parse::<Byte>()
44        .map_err(|_| anyhow!("invalid data size: {}", args.data_size))?;
45
46    let mut suite = performance::suite::Builder::default()
47        .build_hasher(&build_hasher)
48        .unwrap()
49        .try_build()
50        .unwrap();
51
52    suite.run_speed_test(provider, iterations, desired_data_size, args.threshold)?;
53
54    suite
55        .report()
56        .write_to(&mut std::io::stderr(), &Config::default())?;
57
58    Ok(())
59}