diff --git a/benches/common/default.rs b/benches/common/default.rs new file mode 100644 index 0000000..8c6fac4 --- /dev/null +++ b/benches/common/default.rs @@ -0,0 +1,3 @@ +pub fn default() -> T { + T::default() +} diff --git a/benches/common/mod.rs b/benches/common/mod.rs index 23f5525..97ce6af 100644 --- a/benches/common/mod.rs +++ b/benches/common/mod.rs @@ -1,2 +1,4 @@ +mod default; pub mod setup; pub mod utils; +pub use default::default; diff --git a/benches/common/setup.rs b/benches/common/setup.rs index e855fe2..ae92f72 100644 --- a/benches/common/setup.rs +++ b/benches/common/setup.rs @@ -4,6 +4,7 @@ use csv::Reader; use regex::Regex; use serde::{Deserialize, Deserializer}; use std::{ + fmt::Display, fs::{self, File, create_dir_all}, path::{Path, PathBuf}, str::FromStr, @@ -17,10 +18,10 @@ pub fn init_temp_dir() { TEMP_DIR.get_or_init(|| setup_entries().expect("Failed to setup test directory")); } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Default)] pub struct BenchParams { - pub depth: usize, - pub max_results: usize, + pub depth: Option, + pub max_results: Option, pub verbose: bool, } @@ -186,3 +187,15 @@ fn create_dir(path: &Path) -> anyhow::Result<()> { create_dir_all(path)?; Ok(()) } + +impl Display for BenchParams { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!( + f, + "depth: {}, max: {}, verbose: {}", + self.depth.unwrap_or_default(), + self.max_results.unwrap_or_default(), + self.verbose + ) + } +} diff --git a/benches/common/utils.rs b/benches/common/utils.rs index 674646a..51940dd 100644 --- a/benches/common/utils.rs +++ b/benches/common/utils.rs @@ -1,20 +1,18 @@ +use anyhow::anyhow; use std::{ path::{Path, PathBuf}, process::Command, }; +use super::setup::BenchParams; + pub const BASE_DIR: &str = env!("CARGO_MANIFEST_DIR"); -pub fn run_binary_with_args( - path: &Path, - depth: usize, - max_results: usize, - verbose: bool, -) -> anyhow::Result<()> { +pub fn run_binary_with_args(path: &Path, params: &BenchParams) -> anyhow::Result<()> { let binary_path = PathBuf::from(BASE_DIR).join("target/release/project-finder"); if !binary_path.exists() { - return Err(anyhow::anyhow!( + return Err(anyhow!( "Binary not found at {}. Did you run `cargo build --release`?", binary_path.display() )); @@ -25,26 +23,28 @@ pub fn run_binary_with_args( // Add the path to search cmd.arg(path); - // Add depth parameter - cmd.arg("--depth").arg(depth.to_string()); + if let Some(depth) = params.depth { + // Add depth parameter + cmd.arg("--depth").arg(depth.to_string()); + } // Add max_results parameter if not zero - if max_results > 0 { + if let Some(max_results) = params.max_results { cmd.arg("--max-results").arg(max_results.to_string()); } // Add verbose flag if true - if verbose { + if params.verbose { cmd.arg("--verbose"); } - let output = cmd.output().map_err(|e| { - anyhow::anyhow!("Failed to execute binary {}: {}", binary_path.display(), e) - })?; + let output = cmd + .output() + .map_err(|e| anyhow!("Failed to execute binary {}: {}", binary_path.display(), e))?; if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); - return Err(anyhow::anyhow!( + return Err(anyhow!( "Process failed with status: {}\nStderr: {}", output.status, stderr @@ -53,6 +53,7 @@ pub fn run_binary_with_args( Ok(()) } + pub fn create_deep_directory(base: &Path, depth: usize) -> anyhow::Result<()> { todo!() } diff --git a/benches/scenarios/basic.rs b/benches/scenarios/basic.rs index 6afc656..a17d7eb 100644 --- a/benches/scenarios/basic.rs +++ b/benches/scenarios/basic.rs @@ -1,20 +1,11 @@ +use std::fmt::format; + use crate::common::{ - setup::{BenchParams, TEMP_DIR, init_temp_dir, setup_entries}, - utils::{BASE_DIR, run_binary_with_args}, + default, + setup::{BenchParams, TEMP_DIR, init_temp_dir}, + utils::run_binary_with_args, }; use criterion::{BenchmarkId, Criterion}; -use std::{ - path::{Path, PathBuf}, - process::Command, -}; - -fn process_directory(path: &Path) { - let binary_path = PathBuf::from(BASE_DIR).join("target/release/project-finder"); - Command::new(binary_path) - .arg(path) - .output() - .expect("failed to run binary"); -} pub fn benchmark_basic(c: &mut Criterion) { init_temp_dir(); @@ -22,37 +13,31 @@ pub fn benchmark_basic(c: &mut Criterion) { let params = vec![ BenchParams { - depth: 1, - max_results: 0, - verbose: false, + depth: Some(1), + ..Default::default() }, BenchParams { - depth: 5, - max_results: 0, - verbose: false, + depth: Some(5), + ..default() + }, + BenchParams { + depth: Some(10), + ..default() + }, + BenchParams { + depth: Some(10), + max_results: Some(10), + ..default() }, ]; let mut group = c.benchmark_group("basic_scenarios"); - group.bench_function("process_directory", |b| { - b.iter(|| process_directory(temp_dir)) - }); - - for param in params { - let id = BenchmarkId::new( - format!( - "depth{}_max{}_verbose{}", - param.depth, param.max_results, param.verbose - ), - param.depth, - ); + for (idx, param) in params.iter().enumerate() { + let id = BenchmarkId::new(format!("with_param_{idx}"), ¶m); group.bench_with_input(id, ¶m, |b, param| { - b.iter(|| { - run_binary_with_args(temp_dir, param.depth, param.max_results, param.verbose) - .expect("Failed to run binary") - }) + b.iter(|| run_binary_with_args(temp_dir, param).expect("Failed to run binary")) }); }