mirror of
https://github.com/sharkdp/hyperfine.git
synced 2024-11-26 03:25:46 +03:00
Initial changes to skip libc for cpu time on windows
Mark more non-windows as conditional
This commit is contained in:
parent
5b755f9fa8
commit
1ddf729c7a
@ -13,9 +13,11 @@ version = "0.4.0"
|
|||||||
colored = "1.6"
|
colored = "1.6"
|
||||||
indicatif = "0.9"
|
indicatif = "0.9"
|
||||||
statistical = "0.1"
|
statistical = "0.1"
|
||||||
libc = "0.2"
|
|
||||||
atty = "0.2.2"
|
atty = "0.2.2"
|
||||||
|
|
||||||
|
[target.'cfg(not(target_os = "windows"))'.dependencies]
|
||||||
|
libc = "0.2"
|
||||||
|
|
||||||
[dependencies.clap]
|
[dependencies.clap]
|
||||||
version = "2"
|
version = "2"
|
||||||
default-features = false
|
default-features = false
|
||||||
|
@ -9,9 +9,11 @@ use hyperfine::internal::{get_progress_bar, max, min, CmdFailureAction, Hyperfin
|
|||||||
OutputStyleOption, Second, MIN_EXECUTION_TIME};
|
OutputStyleOption, Second, MIN_EXECUTION_TIME};
|
||||||
use hyperfine::warnings::Warnings;
|
use hyperfine::warnings::Warnings;
|
||||||
use hyperfine::format::{format_duration, format_duration_unit};
|
use hyperfine::format::{format_duration, format_duration_unit};
|
||||||
use hyperfine::cputime::{cpu_time_interval, get_cpu_times};
|
|
||||||
use hyperfine::outlier_detection::{modified_zscores, OUTLIER_THRESHOLD};
|
use hyperfine::outlier_detection::{modified_zscores, OUTLIER_THRESHOLD};
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
use hyperfine::cputime::{cpu_time_interval, get_cpu_times};
|
||||||
|
|
||||||
/// Results from timing a single shell command
|
/// Results from timing a single shell command
|
||||||
#[derive(Debug, Copy, Clone)]
|
#[derive(Debug, Copy, Clone)]
|
||||||
pub struct TimingResult {
|
pub struct TimingResult {
|
||||||
@ -34,7 +36,9 @@ fn subtract_shell_spawning_time(time: Second, shell_spawning_time: Second) -> Se
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Run the given shell command and measure the execution time
|
/// Run the given shell command and measure the execution time
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
pub fn time_shell_command(
|
pub fn time_shell_command(
|
||||||
shell_cmd: &str,
|
shell_cmd: &str,
|
||||||
failure_action: CmdFailureAction,
|
failure_action: CmdFailureAction,
|
||||||
@ -87,6 +91,51 @@ pub fn time_shell_command(
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Run the given shell command and measure the execution time
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
pub fn time_shell_command(
|
||||||
|
shell_cmd: &str,
|
||||||
|
failure_action: CmdFailureAction,
|
||||||
|
shell_spawning_time: Option<TimingResult>,
|
||||||
|
) -> io::Result<(TimingResult, bool)> {
|
||||||
|
let start = Instant::now();
|
||||||
|
|
||||||
|
let status = Command::new("sh")
|
||||||
|
.arg("-c")
|
||||||
|
.arg(shell_cmd)
|
||||||
|
.stdin(Stdio::null())
|
||||||
|
.stdout(Stdio::null())
|
||||||
|
.stderr(Stdio::null())
|
||||||
|
.status()?;
|
||||||
|
|
||||||
|
let duration = start.elapsed();
|
||||||
|
|
||||||
|
if failure_action == CmdFailureAction::RaiseError && !status.success() {
|
||||||
|
return Err(io::Error::new(
|
||||||
|
io::ErrorKind::Other,
|
||||||
|
"Command terminated with non-zero exit code. \
|
||||||
|
Use the '-i'/'--ignore-failure' option if you want to ignore this.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Real time
|
||||||
|
let mut time_real = duration.as_secs() as f64 + (duration.subsec_nanos() as f64) * 1e-9;
|
||||||
|
|
||||||
|
// Correct for shell spawning time
|
||||||
|
if let Some(spawning_time) = shell_spawning_time {
|
||||||
|
time_real = subtract_shell_spawning_time(time_real, spawning_time.time_real);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok((
|
||||||
|
TimingResult {
|
||||||
|
time_real,
|
||||||
|
time_user: 0,
|
||||||
|
time_system: 0,
|
||||||
|
},
|
||||||
|
status.success(),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
/// Measure the average shell spawning time
|
/// Measure the average shell spawning time
|
||||||
pub fn mean_shell_spawning_time(style: &OutputStyleOption) -> io::Result<TimingResult> {
|
pub fn mean_shell_spawning_time(style: &OutputStyleOption) -> io::Result<TimingResult> {
|
||||||
const COUNT: u64 = 200;
|
const COUNT: u64 = 200;
|
||||||
@ -252,15 +301,8 @@ pub fn run_benchmark(
|
|||||||
let (user_str, user_unit) = format_duration_unit(user_mean, None);
|
let (user_str, user_unit) = format_duration_unit(user_mean, None);
|
||||||
let system_str = format_duration(system_mean, Some(user_unit));
|
let system_str = format_duration(system_mean, Some(user_unit));
|
||||||
|
|
||||||
println!(
|
output_times(mean_str, stddev_str, user_str, system_str);
|
||||||
" Time ({} ± {}): {:>8} ± {:>8} [User: {}, System: {}]",
|
|
||||||
"mean".green().bold(),
|
|
||||||
"σ".green(),
|
|
||||||
mean_str.green().bold(),
|
|
||||||
stddev_str.green(),
|
|
||||||
user_str.blue(),
|
|
||||||
system_str.blue()
|
|
||||||
);
|
|
||||||
println!(" ");
|
println!(" ");
|
||||||
|
|
||||||
println!(
|
println!(
|
||||||
@ -304,3 +346,27 @@ pub fn run_benchmark(
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
fn output_times(mean_str: String, stddev_str: String, user_str: String, system_str: String) {
|
||||||
|
println!(
|
||||||
|
" Time ({} ± {}): {:>8} ± {:>8} [User: {}, System: {}]",
|
||||||
|
"mean".green().bold(),
|
||||||
|
"σ".green(),
|
||||||
|
mean_str.green().bold(),
|
||||||
|
stddev_str.green(),
|
||||||
|
user_str.blue(),
|
||||||
|
system_str.blue()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
fn output_times(mean_str: String, stddev_str: String, _user_str: String, _system_str: String) {
|
||||||
|
println!(
|
||||||
|
" Time ({} ± {}): {:>8} ± {:>8}",
|
||||||
|
"mean".green().bold(),
|
||||||
|
"σ".green(),
|
||||||
|
mean_str.green().bold(),
|
||||||
|
stddev_str.green(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
use libc::{getrusage, rusage, RUSAGE_CHILDREN};
|
use libc::{getrusage, rusage, RUSAGE_CHILDREN};
|
||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
use hyperfine::internal::Second;
|
use hyperfine::internal::Second;
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
extern crate atty;
|
extern crate atty;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
extern crate colored;
|
extern crate colored;
|
||||||
extern crate indicatif;
|
extern crate indicatif;
|
||||||
extern crate libc;
|
|
||||||
extern crate statistical;
|
extern crate statistical;
|
||||||
|
|
||||||
|
#[cfg(not(target_os = "windows"))]
|
||||||
|
extern crate libc;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate approx;
|
extern crate approx;
|
||||||
|
Loading…
Reference in New Issue
Block a user