diff --git a/src/benchmark/executor.rs b/src/benchmark/executor.rs index 098451b..609b2d3 100644 --- a/src/benchmark/executor.rs +++ b/src/benchmark/executor.rs @@ -180,6 +180,7 @@ impl<'a> Executor for ShellExecutor<'a> { COUNT, "Measuring shell spawning time", self.options.output_style, + self.options.show_elapsed, )) } else { None @@ -214,7 +215,8 @@ impl<'a> Executor for ShellExecutor<'a> { } if let Some(bar) = progress_bar.as_ref() { - bar.inc(1) + bar.inc(1); + bar.reset_elapsed(); } } diff --git a/src/benchmark/mod.rs b/src/benchmark/mod.rs index 35c0e27..e9900f4 100644 --- a/src/benchmark/mod.rs +++ b/src/benchmark/mod.rs @@ -182,6 +182,7 @@ impl<'a> Benchmark<'a> { self.options.warmup_count, "Performing warmup runs", self.options.output_style, + self.options.show_elapsed, )) } else { None @@ -192,7 +193,8 @@ impl<'a> Benchmark<'a> { let _ = self.executor.run_command_and_measure(self.command, None)?; let _ = run_conclusion_command()?; if let Some(bar) = progress_bar.as_ref() { - bar.inc(1) + bar.inc(1); + bar.reset_elapsed(); } } if let Some(bar) = progress_bar.as_ref() { @@ -206,6 +208,7 @@ impl<'a> Benchmark<'a> { self.options.run_bounds.min, "Initial time measurement", self.options.output_style, + self.options.show_elapsed, )) } else { None @@ -256,7 +259,8 @@ impl<'a> Benchmark<'a> { bar.set_length(count) } if let Some(bar) = progress_bar.as_ref() { - bar.inc(1) + bar.inc(1); + bar.reset_elapsed(); } // Gather statistics (perform the actual benchmark) @@ -283,7 +287,8 @@ impl<'a> Benchmark<'a> { all_succeeded = all_succeeded && success; if let Some(bar) = progress_bar.as_ref() { - bar.inc(1) + bar.inc(1); + bar.reset_elapsed(); } run_conclusion_command()?; diff --git a/src/cli.rs b/src/cli.rs index cc924cb..c74db57 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -244,6 +244,17 @@ fn build_command() -> Command { * 'mean-time': order benchmarks by mean runtime\n" ), ) + .arg( + Arg::new("show-elapsed") + .long("show-elapsed") + .short('E') + .action(ArgAction::SetTrue) + .help( + "Show time elapsed since the current run was started. \ + This is useful for especially long benchmarks to see \ + the progress the benchmark has made" + ) + ) .arg( Arg::new("time-unit") .long("time-unit") diff --git a/src/options.rs b/src/options.rs index 7511bb7..30be916 100644 --- a/src/options.rs +++ b/src/options.rs @@ -236,6 +236,9 @@ pub struct Options { /// Which time unit to use when displaying results pub time_unit: Option, + + /// Show elapsed time since current run start. + pub show_elapsed: bool, } impl Default for Options { @@ -256,6 +259,7 @@ impl Default for Options { command_output_policy: CommandOutputPolicy::Null, time_unit: None, command_input_policy: CommandInputPolicy::Null, + show_elapsed: false, } } } @@ -427,6 +431,10 @@ impl Options { CommandInputPolicy::Null }; + if matches.get_flag("show-elapsed") { + options.show_elapsed = true; + } + Ok(options) } diff --git a/src/output/progress_bar.rs b/src/output/progress_bar.rs index ce2dd1a..b824014 100644 --- a/src/output/progress_bar.rs +++ b/src/output/progress_bar.rs @@ -10,12 +10,22 @@ const TICK_SETTINGS: (&str, u64) = ("⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ ", 80); const TICK_SETTINGS: (&str, u64) = (r"+-x| ", 200); /// Return a pre-configured progress bar -pub fn get_progress_bar(length: u64, msg: &str, option: OutputStyleOption) -> ProgressBar { +pub fn get_progress_bar( + length: u64, + msg: &str, + option: OutputStyleOption, + show_elapsed: bool, +) -> ProgressBar { + let template_str = match show_elapsed { + true => " {spinner} {msg:<30} {wide_bar} ET {elapsed_precise} ETA {eta_precise} ", + false => " {spinner} {msg:<30} {wide_bar} ETA {eta_precise} ", + }; + let progressbar_style = match option { OutputStyleOption::Basic | OutputStyleOption::Color => ProgressStyle::default_bar(), _ => ProgressStyle::default_spinner() .tick_chars(TICK_SETTINGS.0) - .template(" {spinner} {msg:<30} {wide_bar} ETA {eta_precise} ") + .template(template_str) .expect("no template error"), };