mirror of
https://github.com/sharkdp/hyperfine.git
synced 2026-11-02 01:00:31 +00:00
Add --setup option, closes #8
This commit is contained in:
1 parent
b0bab45e51
commit
a4df90e44c
3 files changed
+47
-14
No files matched your search
@@ -2,7 +2,7 @@ use std::io;
|
|||||||
use std::process::{Command, Stdio};
|
use std::process::{Command, Stdio};
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
|
||||||
use ansi_term::Colour::{Cyan, Green, White, Yellow, Purple};
|
use ansi_term::Colour::{Cyan, Green, Purple, White, Yellow};
|
||||||
use statistical::{mean, standard_deviation};
|
use statistical::{mean, standard_deviation};
|
||||||
|
|
||||||
use hyperfine::internal::{get_progress_bar, max, min, HyperfineOptions, Second, Warnings,
|
use hyperfine::internal::{get_progress_bar, max, min, HyperfineOptions, Second, Warnings,
|
||||||
@@ -133,6 +133,14 @@ pub fn run_benchmark(
|
|||||||
// Set up progress bar (and spinner for initial measurement)
|
// Set up progress bar (and spinner for initial measurement)
|
||||||
let bar = get_progress_bar(options.min_runs, "Initial time measurement");
|
let bar = get_progress_bar(options.min_runs, "Initial time measurement");
|
||||||
|
|
||||||
|
// Run setup / cleanup command
|
||||||
|
let run_setup_command = || {
|
||||||
|
if let Some(ref setup_command) = options.setup_command {
|
||||||
|
let _ = time_shell_command(setup_command, options.ignore_failure, None);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
run_setup_command();
|
||||||
|
|
||||||
// Initial timing run
|
// Initial timing run
|
||||||
let res = time_shell_command(cmd, options.ignore_failure, Some(shell_spawning_time))?;
|
let res = time_shell_command(cmd, options.ignore_failure, Some(shell_spawning_time))?;
|
||||||
|
|
||||||
@@ -157,6 +165,8 @@ pub fn run_benchmark(
|
|||||||
|
|
||||||
// Gather statistics
|
// Gather statistics
|
||||||
for _ in 0..count_remaining {
|
for _ in 0..count_remaining {
|
||||||
|
run_setup_command();
|
||||||
|
|
||||||
let msg = {
|
let msg = {
|
||||||
let mean = format_duration(mean(&execution_times), Unit::Auto);
|
let mean = format_duration(mean(&execution_times), Unit::Auto);
|
||||||
format!("Current estimate: {}", Green.paint(mean))
|
format!("Current estimate: {}", Green.paint(mean))
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ pub struct HyperfineOptions {
|
|||||||
|
|
||||||
/// Whether or not to ignore non-zero exit codes
|
/// Whether or not to ignore non-zero exit codes
|
||||||
pub ignore_failure: bool,
|
pub ignore_failure: bool,
|
||||||
|
|
||||||
|
/// Command to run before each benchmark run
|
||||||
|
pub setup_command: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for HyperfineOptions {
|
impl Default for HyperfineOptions {
|
||||||
@@ -30,6 +33,7 @@ impl Default for HyperfineOptions {
|
|||||||
min_runs: 10,
|
min_runs: 10,
|
||||||
min_time_sec: 3.0,
|
min_time_sec: 3.0,
|
||||||
ignore_failure: false,
|
ignore_failure: false,
|
||||||
|
setup_command: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-13
@@ -35,6 +35,9 @@ fn run(commands: &Vec<&str>, options: &HyperfineOptions) -> io::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
// Process command line options
|
||||||
|
let mut options = HyperfineOptions::default();
|
||||||
|
|
||||||
let matches = App::new("hyperfine")
|
let matches = App::new("hyperfine")
|
||||||
.version(crate_version!())
|
.version(crate_version!())
|
||||||
.setting(AppSettings::ColoredHelp)
|
.setting(AppSettings::ColoredHelp)
|
||||||
@@ -47,13 +50,33 @@ fn main() {
|
|||||||
.multiple(true)
|
.multiple(true)
|
||||||
.empty_values(false),
|
.empty_values(false),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("ignore-failure")
|
||||||
|
.long("ignore-failure")
|
||||||
|
.short("i")
|
||||||
|
.help("Ignore non-zero exit codes"),
|
||||||
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("setup")
|
||||||
|
.long("setup")
|
||||||
|
.short("S")
|
||||||
|
.takes_value(true)
|
||||||
|
.value_name("CMD")
|
||||||
|
.help(
|
||||||
|
"Execute CMD before each benchmark run. This is useful for \
|
||||||
|
clearing disk caches, for example.",
|
||||||
|
),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("warmup")
|
Arg::with_name("warmup")
|
||||||
.long("warmup")
|
.long("warmup")
|
||||||
.short("w")
|
.short("w")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.value_name("NUM")
|
.value_name("NUM")
|
||||||
.help("Perform NUM warmup runs before the actual benchmark"),
|
.help(
|
||||||
|
"Perform NUM warmup runs before the actual benchmark. This can be used \
|
||||||
|
to fill (disk) caches for I/O-heavy programs.",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("min-runs")
|
Arg::with_name("min-runs")
|
||||||
@@ -61,20 +84,18 @@ fn main() {
|
|||||||
.short("m")
|
.short("m")
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.value_name("NUM")
|
.value_name("NUM")
|
||||||
.help("Perform at least NUM runs for each command"),
|
.help(&format!(
|
||||||
)
|
"Perform at least NUM runs for each command (default: {}).",
|
||||||
.arg(
|
options.min_runs
|
||||||
Arg::with_name("ignore-failure")
|
)),
|
||||||
.long("ignore-failure")
|
|
||||||
.short("i")
|
|
||||||
.help("Ignore non-zero exit codes"),
|
|
||||||
)
|
)
|
||||||
.get_matches();
|
.get_matches();
|
||||||
|
|
||||||
let str_to_u64 = |n| u64::from_str_radix(n, 10).ok();
|
options.ignore_failure = matches.is_present("ignore-failure");
|
||||||
|
|
||||||
// Process command line options
|
options.setup_command = matches.value_of("setup").map(String::from);
|
||||||
let mut options = HyperfineOptions::default();
|
|
||||||
|
let str_to_u64 = |n| u64::from_str_radix(n, 10).ok();
|
||||||
|
|
||||||
options.warmup_count = matches
|
options.warmup_count = matches
|
||||||
.value_of("warmup")
|
.value_of("warmup")
|
||||||
@@ -86,8 +107,6 @@ fn main() {
|
|||||||
options.min_runs = cmp::max(2, min_runs);
|
options.min_runs = cmp::max(2, min_runs);
|
||||||
}
|
}
|
||||||
|
|
||||||
options.ignore_failure = matches.is_present("ignore-failure");
|
|
||||||
|
|
||||||
let commands = matches.values_of("command").unwrap().collect();
|
let commands = matches.values_of("command").unwrap().collect();
|
||||||
let res = run(&commands, &options);
|
let res = run(&commands, &options);
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user