revme/cmd/
bench.rs

1pub mod analysis;
2pub mod burntpix;
3pub mod evm_build;
4pub mod snailtracer;
5pub mod transfer;
6
7use clap::{Parser, ValueEnum};
8
9#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
10pub enum BenchName {
11    Analysis,
12    Burntpix,
13    Snailtracer,
14    Transfer,
15    EvmBuild,
16}
17
18impl BenchName {
19    pub const ALL: &[BenchName] = &[
20        BenchName::Analysis,
21        BenchName::Burntpix,
22        BenchName::Snailtracer,
23        BenchName::Transfer,
24        BenchName::EvmBuild,
25    ];
26
27    pub fn as_str(self) -> &'static str {
28        match self {
29            BenchName::Analysis => "analysis",
30            BenchName::Burntpix => "burntpix",
31            BenchName::Snailtracer => "snailtracer",
32            BenchName::Transfer => "transfer",
33            BenchName::EvmBuild => "evm-build",
34        }
35    }
36}
37
38/// `bytecode` subcommand
39#[derive(Parser, Debug)]
40pub struct Cmd {
41    #[arg(value_enum)]
42    pub name: BenchName,
43    /// Warmup represents warm up time for benchmarks ran
44    #[arg(short = 'w', long)]
45    pub warmup: Option<f64>,
46    /// Samples represents default measurement time for benchmarks ran
47    #[arg(short = 'm', long)]
48    pub time: Option<f64>,
49    /// Samples represents size of the sample for benchmarks ran
50    #[arg(short = 's', long)]
51    pub samples: Option<usize>,
52}
53
54impl Cmd {
55    /// Runs bench command.
56    pub fn run(&self) {
57        let mut criterion = criterion::Criterion::default()
58            .warm_up_time(std::time::Duration::from_secs_f64(
59                self.warmup.unwrap_or(0.5),
60            ))
61            // Measurement_time of 0.1 will get 500+ iterations for analysis and transfer and will be extended if needed in order to test the given sample size (minimum sample size is 10 per criterion documentation) as is the case with burntpix and snailtracer benchmark tests
62            .measurement_time(std::time::Duration::from_secs_f64(self.time.unwrap_or(1.5)))
63            .sample_size(self.samples.unwrap_or(10));
64
65        match self.name {
66            BenchName::Analysis => {
67                analysis::run(&mut criterion);
68            }
69            BenchName::Burntpix => {
70                burntpix::run(&mut criterion);
71            }
72            BenchName::Snailtracer => {
73                snailtracer::run(&mut criterion);
74            }
75            BenchName::Transfer => {
76                transfer::run(&mut criterion);
77            }
78            BenchName::EvmBuild => {
79                evm_build::run(&mut criterion);
80            }
81        }
82    }
83}