From 4f893b505efe2aedb4f6978a3498272eb0b323ec Mon Sep 17 00:00:00 2001 From: David Peter Date: Tue, 6 Oct 2026 13:34:03 +0200 Subject: [PATCH] Simplifications --- src/benchmark/executor.rs | 3 ++ src/benchmark/measurement.rs | 30 ++------------ src/benchmark/scheduler.rs | 24 +++++------ src/export/csv.rs | 6 +++ src/export/tests.rs | 24 +++++++++++ src/metric.rs | 3 +- src/timer/mod.rs | 1 + .../integration_tests__json_export_basic.snap | 41 ++++++++++--------- ...n_export_parameterized_with_reference.snap | 41 ++++++++++--------- ...gration_tests__json_export_single_run.snap | 11 ++--- 10 files changed, 100 insertions(+), 84 deletions(-) diff --git a/src/benchmark/executor.rs b/src/benchmark/executor.rs index 762204b..a0e584c 100644 --- a/src/benchmark/executor.rs +++ b/src/benchmark/executor.rs @@ -220,6 +220,7 @@ impl Executor for ShellExecutor<'_> { ensure_non_negative(measurement.time_user - spawning_time.time_user); measurement.time_system = ensure_non_negative(measurement.time_system - spawning_time.time_system); + measurement.time_cpu = measurement.time_user + measurement.time_system; } Ok(measurement) @@ -278,6 +279,7 @@ impl Executor for ShellExecutor<'_> { self.shell_spawning_time = Some(Measurement { time_wall_clock: measurements.time_wall_clock_mean(), + time_cpu: measurements.time_user_mean() + measurements.time_system_mean(), time_user: measurements.time_user_mean(), time_system: measurements.time_system_mean(), memory_peak_resident: None, @@ -337,6 +339,7 @@ impl Executor for MockExecutor { Ok(Measurement { time_wall_clock: Self::extract_time(command.get_command_line()), + time_cpu: Time::zero(), time_user: Time::zero(), time_system: Time::zero(), memory_peak_resident: Some(Information::zero()), diff --git a/src/benchmark/measurement.rs b/src/benchmark/measurement.rs index 8911f2d..5c27a1f 100644 --- a/src/benchmark/measurement.rs +++ b/src/benchmark/measurement.rs @@ -78,6 +78,10 @@ pub struct Measurement { #[serde(serialize_with = "serialize_time")] pub time_wall_clock: Time, + /// Total CPU time (user and kernel mode) + #[serde(serialize_with = "serialize_time")] + pub time_cpu: Time, + /// Time spent in user mode #[serde(serialize_with = "serialize_time")] pub time_user: Time, @@ -101,34 +105,8 @@ pub struct Measurement { pub exit_status: ExitStatus, } -impl Measurement { - /// Total CPU time for this run, including user and kernel mode. - pub fn time_cpu(&self) -> Time { - self.time_user + self.time_system - } -} - -fn serialize_measurements(measurements: &[Measurement], serializer: S) -> Result -where - S: serde::Serializer, -{ - #[derive(Serialize)] - struct WithCpuTime<'a> { - #[serde(flatten)] - measurement: &'a Measurement, - #[serde(serialize_with = "serialize_time")] - time_cpu: Time, - } - - serializer.collect_seq(measurements.iter().map(|measurement| WithCpuTime { - measurement, - time_cpu: measurement.time_cpu(), - })) -} - #[derive(Debug, Default, Clone, Serialize, PartialEq)] pub struct Measurements { - #[serde(serialize_with = "serialize_measurements")] pub measurements: Vec, } diff --git a/src/benchmark/scheduler.rs b/src/benchmark/scheduler.rs index c6431dc..d47dcbc 100644 --- a/src/benchmark/scheduler.rs +++ b/src/benchmark/scheduler.rs @@ -87,6 +87,9 @@ fn scheduler_basic() -> Result<()> { - time_wall_clock: value: 0.123 unit: second + time_cpu: + value: 0 + unit: second time_user: value: 0 unit: second @@ -97,12 +100,12 @@ fn scheduler_basic() -> Result<()> { value: 0 unit: byte exit_code: 0 - time_cpu: - value: 0 - unit: second - time_wall_clock: value: 0.123 unit: second + time_cpu: + value: 0 + unit: second time_user: value: 0 unit: second @@ -113,14 +116,14 @@ fn scheduler_basic() -> Result<()> { value: 0 unit: byte exit_code: 0 - time_cpu: - value: 0 - unit: second - command: sleep 0.456 measurements: - time_wall_clock: value: 0.456 unit: second + time_cpu: + value: 0 + unit: second time_user: value: 0 unit: second @@ -131,12 +134,12 @@ fn scheduler_basic() -> Result<()> { value: 0 unit: byte exit_code: 0 - time_cpu: - value: 0 - unit: second - time_wall_clock: value: 0.456 unit: second + time_cpu: + value: 0 + unit: second time_user: value: 0 unit: second @@ -147,9 +150,6 @@ fn scheduler_basic() -> Result<()> { value: 0 unit: byte exit_code: 0 - time_cpu: - value: 0 - unit: second "); Ok(()) diff --git a/src/export/csv.rs b/src/export/csv.rs index d4d3718..4dd8c31 100644 --- a/src/export/csv.rs +++ b/src/export/csv.rs @@ -94,6 +94,7 @@ fn test_csv() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(7.0), + time_cpu: Time::new::(7.0), time_user: Time::new::(7.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -102,6 +103,7 @@ fn test_csv() { }, Measurement { time_wall_clock: Time::new::(8.0), + time_cpu: Time::new::(8.0), time_user: Time::new::(8.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -110,6 +112,7 @@ fn test_csv() { }, Measurement { time_wall_clock: Time::new::(12.0), + time_cpu: Time::new::(12.0), time_user: Time::new::(12.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -141,6 +144,7 @@ fn test_csv() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(17.0), + time_cpu: Time::new::(17.0), time_user: Time::new::(17.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -149,6 +153,7 @@ fn test_csv() { }, Measurement { time_wall_clock: Time::new::(18.0), + time_cpu: Time::new::(18.0), time_user: Time::new::(18.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -157,6 +162,7 @@ fn test_csv() { }, Measurement { time_wall_clock: Time::new::(19.0), + time_cpu: Time::new::(19.0), time_user: Time::new::(19.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), diff --git a/src/export/tests.rs b/src/export/tests.rs index 8ecbe63..676b830 100644 --- a/src/export/tests.rs +++ b/src/export/tests.rs @@ -41,6 +41,7 @@ fn test_markup_export_auto_ms() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(0.09), + time_cpu: Time::new::(0.09), time_user: Time::new::(0.09), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -49,6 +50,7 @@ fn test_markup_export_auto_ms() { }, Measurement { time_wall_clock: Time::new::(0.10), + time_cpu: Time::new::(0.10), time_user: Time::new::(0.10), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -57,6 +59,7 @@ fn test_markup_export_auto_ms() { }, Measurement { time_wall_clock: Time::new::(0.14), + time_cpu: Time::new::(0.14), time_user: Time::new::(0.14), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -73,6 +76,7 @@ fn test_markup_export_auto_ms() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(2.0), + time_cpu: Time::new::(2.0), time_user: Time::new::(2.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -81,6 +85,7 @@ fn test_markup_export_auto_ms() { }, Measurement { time_wall_clock: Time::new::(3.0), + time_cpu: Time::new::(3.0), time_user: Time::new::(3.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -89,6 +94,7 @@ fn test_markup_export_auto_ms() { }, Measurement { time_wall_clock: Time::new::(4.0), + time_cpu: Time::new::(4.0), time_user: Time::new::(4.0), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -150,6 +156,7 @@ fn test_markup_export_auto_s() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(2.1), + time_cpu: Time::new::(2.1), time_user: Time::new::(2.1), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -158,6 +165,7 @@ fn test_markup_export_auto_s() { }, Measurement { time_wall_clock: Time::new::(2.2), + time_cpu: Time::new::(2.2), time_user: Time::new::(2.2), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -166,6 +174,7 @@ fn test_markup_export_auto_s() { }, Measurement { time_wall_clock: Time::new::(2.3), + time_cpu: Time::new::(2.3), time_user: Time::new::(2.3), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -182,6 +191,7 @@ fn test_markup_export_auto_s() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(0.1), + time_cpu: Time::new::(0.1), time_user: Time::new::(0.1), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -190,6 +200,7 @@ fn test_markup_export_auto_s() { }, Measurement { time_wall_clock: Time::new::(0.2), + time_cpu: Time::new::(0.2), time_user: Time::new::(0.2), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -198,6 +209,7 @@ fn test_markup_export_auto_s() { }, Measurement { time_wall_clock: Time::new::(0.3), + time_cpu: Time::new::(0.3), time_user: Time::new::(0.3), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -259,6 +271,7 @@ fn test_markup_export_manual_ms() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(2.1), + time_cpu: Time::new::(2.1), time_user: Time::new::(2.1), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -267,6 +280,7 @@ fn test_markup_export_manual_ms() { }, Measurement { time_wall_clock: Time::new::(2.2), + time_cpu: Time::new::(2.2), time_user: Time::new::(2.2), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -275,6 +289,7 @@ fn test_markup_export_manual_ms() { }, Measurement { time_wall_clock: Time::new::(2.3), + time_cpu: Time::new::(2.3), time_user: Time::new::(2.3), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -291,6 +306,7 @@ fn test_markup_export_manual_ms() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(0.1), + time_cpu: Time::new::(0.1), time_user: Time::new::(0.1), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -299,6 +315,7 @@ fn test_markup_export_manual_ms() { }, Measurement { time_wall_clock: Time::new::(0.2), + time_cpu: Time::new::(0.2), time_user: Time::new::(0.2), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -307,6 +324,7 @@ fn test_markup_export_manual_ms() { }, Measurement { time_wall_clock: Time::new::(0.3), + time_cpu: Time::new::(0.3), time_user: Time::new::(0.3), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -367,6 +385,7 @@ fn test_markup_export_manual_s() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(2.01), + time_cpu: Time::new::(2.01), time_user: Time::new::(2.01), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -375,6 +394,7 @@ fn test_markup_export_manual_s() { }, Measurement { time_wall_clock: Time::new::(2.02), + time_cpu: Time::new::(2.02), time_user: Time::new::(2.02), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -383,6 +403,7 @@ fn test_markup_export_manual_s() { }, Measurement { time_wall_clock: Time::new::(2.03), + time_cpu: Time::new::(2.03), time_user: Time::new::(2.03), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -399,6 +420,7 @@ fn test_markup_export_manual_s() { measurements: Measurements::new(vec![ Measurement { time_wall_clock: Time::new::(0.11), + time_cpu: Time::new::(0.11), time_user: Time::new::(0.11), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -407,6 +429,7 @@ fn test_markup_export_manual_s() { }, Measurement { time_wall_clock: Time::new::(0.12), + time_cpu: Time::new::(0.12), time_user: Time::new::(0.12), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), @@ -415,6 +438,7 @@ fn test_markup_export_manual_s() { }, Measurement { time_wall_clock: Time::new::(0.13), + time_cpu: Time::new::(0.13), time_user: Time::new::(0.13), time_system: Time::zero(), memory_peak_resident: Some(Information::new::(1024.)), diff --git a/src/metric.rs b/src/metric.rs index 98fd76c..2564650 100644 --- a/src/metric.rs +++ b/src/metric.rs @@ -69,7 +69,7 @@ impl Metric { let counters = &measurement.hardware_counters; match self { Self::TimeWallClock => Some(measurement.time_wall_clock.get::()), - Self::TimeCpu => Some(measurement.time_cpu().get::()), + Self::TimeCpu => Some(measurement.time_cpu.get::()), Self::TimeUser => Some(measurement.time_user.get::()), Self::TimeSystem => Some(measurement.time_system.get::()), Self::MemoryPeakResident => measurement.memory_peak_resident.map(|v| v.get::()), @@ -362,6 +362,7 @@ mod tests { [(1.0, 3.0), (3.0, 1.0)] .iter() .map(|&(user, system)| Measurement { + time_cpu: Time::new::(user + system), time_user: Time::new::(user), time_system: Time::new::(system), ..Measurement::default() diff --git a/src/timer/mod.rs b/src/timer/mod.rs index d723604..541d7f5 100644 --- a/src/timer/mod.rs +++ b/src/timer/mod.rs @@ -118,6 +118,7 @@ pub fn execute_and_measure( Ok(Measurement { time_wall_clock, + time_cpu: time_user + time_system, time_user, time_system, memory_peak_resident, diff --git a/tests/snapshots/integration_tests__json_export_basic.snap b/tests/snapshots/integration_tests__json_export_basic.snap index a3285ce..aeb249d 100644 --- a/tests/snapshots/integration_tests__json_export_basic.snap +++ b/tests/snapshots/integration_tests__json_export_basic.snap @@ -1,5 +1,6 @@ --- source: tests/integration_tests.rs +assertion_line: 1278 info: program: hyperfine args: @@ -38,6 +39,10 @@ exit_code: 0 "value": 1.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -50,17 +55,17 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 }, { "time_wall_clock": { "value": 1.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -73,11 +78,7 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 } ], "summary": { @@ -136,6 +137,10 @@ exit_code: 0 "value": 2.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -148,17 +153,17 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 }, { "time_wall_clock": { "value": 2.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -171,11 +176,7 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 } ], "summary": { diff --git a/tests/snapshots/integration_tests__json_export_parameterized_with_reference.snap b/tests/snapshots/integration_tests__json_export_parameterized_with_reference.snap index c9d05af..c2451d0 100644 --- a/tests/snapshots/integration_tests__json_export_parameterized_with_reference.snap +++ b/tests/snapshots/integration_tests__json_export_parameterized_with_reference.snap @@ -1,5 +1,6 @@ --- source: tests/integration_tests.rs +assertion_line: 1305 info: program: hyperfine args: @@ -38,6 +39,10 @@ exit_code: 0 "value": 1.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -50,17 +55,17 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 }, { "time_wall_clock": { "value": 1.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -73,11 +78,7 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 } ], "parameters": { @@ -142,6 +143,10 @@ exit_code: 0 "value": 2.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -154,17 +159,17 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 }, { "time_wall_clock": { "value": 2.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -177,11 +182,7 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 } ], "parameters": { diff --git a/tests/snapshots/integration_tests__json_export_single_run.snap b/tests/snapshots/integration_tests__json_export_single_run.snap index 953dcd6..603e858 100644 --- a/tests/snapshots/integration_tests__json_export_single_run.snap +++ b/tests/snapshots/integration_tests__json_export_single_run.snap @@ -1,5 +1,6 @@ --- source: tests/integration_tests.rs +assertion_line: 1294 info: program: hyperfine args: @@ -33,6 +34,10 @@ exit_code: 0 "value": 1.0, "unit": "second" }, + "time_cpu": { + "value": 0.0, + "unit": "second" + }, "time_user": { "value": 0.0, "unit": "second" @@ -45,11 +50,7 @@ exit_code: 0 "value": 0.0, "unit": "byte" }, - "exit_code": 0, - "time_cpu": { - "value": 0.0, - "unit": "second" - } + "exit_code": 0 } ], "summary": {