Support minutes, hours, and time unit aliases

This commit is contained in:
David Peter committed 2026-10-05 10:18:42 +02:00
1 parent 16e23a1b42
commit 84ff04f35d
6 files changed
+42 -10

No files matched your search

+1
View File
@@ -2,6 +2,7 @@
## Features ## Features
- Add minutes and hours to `--time-unit`, along with abbreviated and plural unit names such as `ms`, `min`, and `hours` (@sharkdp)
- Add `--reference-name` option to give a meaningful name to the reference command, see #808 (@niklasdewally) - Add `--reference-name` option to give a meaningful name to the reference command, see #808 (@niklasdewally)
- The `--ignore-failure` option now supports a comma-separated list of exit codes to ignore (e.g., `--ignore-failure=1,2`), see #836 (@sharkdp) - The `--ignore-failure` option now supports a comma-separated list of exit codes to ignore (e.g., `--ignore-failure=1,2`), see #836 (@sharkdp)
- Python scripts: Add `--time-unit` option to `advanced_statistics.py` (@sharkdp) - Python scripts: Add `--time-unit` option to `advanced_statistics.py` (@sharkdp)
+15 -2
View File
@@ -255,8 +255,21 @@ order benchmarks by mean runtime
.HP .HP
\fB\-u\fR, \fB\-\-time\-unit\fR \fIUNIT\fP \fB\-u\fR, \fB\-\-time\-unit\fR \fIUNIT\fP
.IP .IP
Set the time unit to be used. Possible values: microsecond, millisecond, second. If Set the time unit to be used. If the option is not given, the time unit is
the option is not given, the time unit is determined automatically. determined automatically. Possible values:
.RS
.IP "microsecond"
Aliases: µs, us, microseconds.
.IP "millisecond"
Aliases: ms, milliseconds.
.IP "second"
Aliases: s, seconds.
.IP "minute"
Aliases: min, minutes.
.IP "hour"
Aliases: h, hours.
.RE
.IP
This option affects the standard output as well as all export formats This option affects the standard output as well as all export formats
except for CSV and JSON. except for CSV and JSON.
.HP .HP
+9 -4
View File
@@ -278,10 +278,15 @@ fn build_command() -> Command {
.short('u') .short('u')
.action(ArgAction::Set) .action(ArgAction::Set)
.value_name("UNIT") .value_name("UNIT")
.value_parser(["microsecond", "millisecond", "second"]) .value_parser(["µs", "us", "microsecond", "microseconds", "ms", "millisecond", "milliseconds", "s", "second", "seconds", "min", "minute", "minutes", "h", "hour", "hours"])
.help("Set the time unit to be used. Possible values: microsecond, millisecond, second. \ .help("Set the time unit to be used. If the option is not given, the time unit is determined automatically. \
If the option is not given, the time unit is determined automatically. \ This option affects the standard output as well as all export formats except for CSV and JSON.\n\
This option affects the standard output as well as all export formats except for CSV and JSON."), Possible values:\n \
* 'µs', 'us', 'microsecond', 'microseconds'\n \
* 'ms', 'millisecond', 'milliseconds'\n \
* 's', 'second', 'seconds'\n \
* 'min', 'minute', 'minutes'\n \
* 'h', 'hour', 'hours'"),
) )
.arg( .arg(
Arg::new("export-asciidoc") Arg::new("export-asciidoc")
+5 -3
View File
@@ -429,9 +429,11 @@ impl Options {
} }
options.time_unit = match matches.get_one::<String>("time-unit").map(|s| s.as_str()) { options.time_unit = match matches.get_one::<String>("time-unit").map(|s| s.as_str()) {
Some("microsecond") => Some(Unit::MicroSecond), Some("µs" | "us" | "microsecond" | "microseconds") => Some(Unit::MicroSecond),
Some("millisecond") => Some(Unit::MilliSecond), Some("ms" | "millisecond" | "milliseconds") => Some(Unit::MilliSecond),
Some("second") => Some(Unit::Second), Some("s" | "second" | "seconds") => Some(Unit::Second),
Some("min" | "minute" | "minutes") => Some(Unit::Minute),
Some("h" | "hour" | "hours") => Some(Unit::Hour),
_ => None, _ => None,
}; };
+2 -1
View File
@@ -21,7 +21,8 @@ pub fn format_duration_value(duration: Second, unit: Option<Unit>) -> (String, U
} else if (duration < 1.0 && unit.is_none()) || unit == Some(Unit::MilliSecond) { } else if (duration < 1.0 && unit.is_none()) || unit == Some(Unit::MilliSecond) {
(Unit::MilliSecond.format(duration), Unit::MilliSecond) (Unit::MilliSecond.format(duration), Unit::MilliSecond)
} else { } else {
(Unit::Second.format(duration), Unit::Second) let unit = unit.unwrap_or(Unit::Second);
(unit.format(duration), unit)
} }
} }
+10
View File
@@ -11,6 +11,8 @@ pub enum Unit {
Second, Second,
MilliSecond, MilliSecond,
MicroSecond, MicroSecond,
Minute,
Hour,
} }
impl Unit { impl Unit {
@@ -20,6 +22,8 @@ impl Unit {
Unit::Second => String::from("s"), Unit::Second => String::from("s"),
Unit::MilliSecond => String::from("ms"), Unit::MilliSecond => String::from("ms"),
Unit::MicroSecond => String::from("µs"), Unit::MicroSecond => String::from("µs"),
Unit::Minute => String::from("min"),
Unit::Hour => String::from("h"),
} }
} }
@@ -29,6 +33,8 @@ impl Unit {
Unit::Second => format!("{value:.3}"), Unit::Second => format!("{value:.3}"),
Unit::MilliSecond => format!("{:.1}", value * 1e3), Unit::MilliSecond => format!("{:.1}", value * 1e3),
Unit::MicroSecond => format!("{:.1}", value * 1e6), Unit::MicroSecond => format!("{:.1}", value * 1e6),
Unit::Minute => format!("{:.1}", value / 60.0),
Unit::Hour => format!("{:.1}", value / 3600.0),
} }
} }
} }
@@ -38,6 +44,8 @@ fn test_unit_short_name() {
assert_eq!("s", Unit::Second.short_name()); assert_eq!("s", Unit::Second.short_name());
assert_eq!("ms", Unit::MilliSecond.short_name()); assert_eq!("ms", Unit::MilliSecond.short_name());
assert_eq!("µs", Unit::MicroSecond.short_name()); assert_eq!("µs", Unit::MicroSecond.short_name());
assert_eq!("min", Unit::Minute.short_name());
assert_eq!("h", Unit::Hour.short_name());
} }
// Note - the values are rounded when formatted. // Note - the values are rounded when formatted.
@@ -48,4 +56,6 @@ fn test_unit_format() {
assert_eq!("123456.8", Unit::MilliSecond.format(value)); assert_eq!("123456.8", Unit::MilliSecond.format(value));
assert_eq!("1234.6", Unit::MicroSecond.format(0.00123456)); assert_eq!("1234.6", Unit::MicroSecond.format(0.00123456));
assert_eq!("2.1", Unit::Minute.format(value));
assert_eq!("0.0", Unit::Hour.format(value));
} }