use std::process::ExitStatus; use serde::Serialize; use crate::outlier_detection::modified_zscores; use crate::quantity::{ max, mean, median, min, second, serialize_information, serialize_time, standard_deviation, Information, Time, TimeQuantity, }; use crate::util::exit_code::extract_exit_code; fn serialize_exit_status(exit_status: &ExitStatus, serializer: S) -> Result where S: serde::Serializer, { match extract_exit_code(*exit_status) { Some(code) => serializer.serialize_i32(code), None => serializer.serialize_unit(), } } /// Performance metric measurements and exit code for a single run #[derive(Debug, Clone, Default, Serialize, PartialEq)] pub struct Measurement { /// Elapsed wall clock time (real time) #[serde(serialize_with = "serialize_time")] pub time_wall_clock: Time, /// Time spent in user mode #[serde(serialize_with = "serialize_time")] pub time_user: Time, /// Time spent in kernel mode #[serde(serialize_with = "serialize_time")] pub time_system: Time, /// Maximum memory usage of the process #[serde(serialize_with = "serialize_information")] pub peak_memory_usage: Information, // The exit status of the process #[serde(rename = "exit_code", serialize_with = "serialize_exit_status")] pub exit_status: ExitStatus, } #[derive(Debug, Default, Clone, Serialize, PartialEq)] pub struct Measurements { pub measurements: Vec, } impl Measurements { pub fn new(measurements: Vec) -> Self { Self { measurements } } pub fn len(&self) -> usize { self.measurements.len() } pub fn is_empty(&self) -> bool { self.measurements.is_empty() } pub fn push(&mut self, measurement: Measurement) { self.measurements.push(measurement); } pub fn wall_clock_times(&self) -> Vec