| 1 | //! Measurement statistics. |
| 2 | |
| 3 | use crate::{ |
| 4 | alloc::{AllocOpMap, AllocTally}, |
| 5 | counter::{KnownCounterKind, MaxCountUInt}, |
| 6 | time::FineDuration, |
| 7 | }; |
| 8 | |
| 9 | mod sample; |
| 10 | |
| 11 | pub(crate) use sample::*; |
| 12 | |
| 13 | /// Statistics from samples. |
| 14 | pub(crate) struct Stats { |
| 15 | /// Total number of samples taken. |
| 16 | pub sample_count: u32, |
| 17 | |
| 18 | /// Total number of iterations (currently `sample_count * `sample_size`). |
| 19 | pub iter_count: u64, |
| 20 | |
| 21 | /// Timing statistics. |
| 22 | pub time: StatsSet<FineDuration>, |
| 23 | |
| 24 | /// Maximum allocated bytes and maximum number of allocations associated |
| 25 | /// with the corresponding samples for `time`. |
| 26 | pub max_alloc: AllocTally<StatsSet<f64>>, |
| 27 | |
| 28 | /// Allocation statistics associated with the corresponding samples for |
| 29 | /// `time`. |
| 30 | pub alloc_tallies: AllocOpMap<AllocTally<StatsSet<f64>>>, |
| 31 | |
| 32 | /// `Counter` counts associated with the corresponding samples for `time`. |
| 33 | pub counts: [Option<StatsSet<MaxCountUInt>>; KnownCounterKind::COUNT], |
| 34 | } |
| 35 | |
| 36 | impl Stats { |
| 37 | pub fn get_counts(&self, counter_kind: KnownCounterKind) -> Option<&StatsSet<MaxCountUInt>> { |
| 38 | self.counts[counter_kind as usize].as_ref() |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | #[derive (Debug)] |
| 43 | pub(crate) struct StatsSet<T> { |
| 44 | /// Associated with minimum amount of time taken by an iteration. |
| 45 | pub fastest: T, |
| 46 | |
| 47 | /// Associated with maximum amount of time taken by an iteration. |
| 48 | pub slowest: T, |
| 49 | |
| 50 | /// Associated with midpoint time taken by an iteration. |
| 51 | pub median: T, |
| 52 | |
| 53 | /// Associated with average time taken by all iterations. |
| 54 | pub mean: T, |
| 55 | } |
| 56 | |
| 57 | impl StatsSet<f64> { |
| 58 | pub fn is_zero(&self) -> bool { |
| 59 | self.fastest == 0.0 && self.slowest == 0.0 && self.median == 0.0 && self.mean == 0.0 |
| 60 | } |
| 61 | } |
| 62 | |