use std::collections::HashMap;
use crate::{
alloc::ThreadAllocTallyMap,
counter::KnownCounterKind,
time::{FineDuration, Timer, Timestamp},
};
pub(crate) struct TimeSample {
pub duration: FineDuration,
}
pub(crate) struct RawSample {
pub start: Timestamp,
pub end: Timestamp,
pub timer: Timer,
pub alloc_tallies: ThreadAllocTallyMap,
pub counter_totals: [u128; KnownCounterKind::COUNT],
}
pub(crate) struct ThreadSample {
#[allow(dead_code)]
pub total_wall_time: FineDuration,
}
impl RawSample {
#[inline]
pub fn duration(&self) -> FineDuration {
self.end.duration_since(self.start, self.timer)
}
}
#[derive(Default)]
pub(crate) struct SampleCollection {
pub sample_size: u32,
pub time_samples: Vec<TimeSample>,
pub alloc_tallies: HashMap<u32, ThreadAllocTallyMap>,
pub threads: Vec<ThreadSample>,
}
impl SampleCollection {
#[inline]
pub fn clear(&mut self) {
self.time_samples.clear();
self.alloc_tallies.clear();
self.threads.clear();
}
#[inline]
pub fn iter_count(&self) -> u64 {
self.sample_size as u64 * self.time_samples.len() as u64
}
#[inline]
pub fn total_duration(&self) -> FineDuration {
FineDuration { picos: self.time_samples.iter().map(|s| s.duration.picos).sum() }
}
#[inline]
pub fn sorted_samples(&self) -> Vec<&TimeSample> {
let mut result: Vec<&TimeSample> = self.time_samples.iter().collect();
result.sort_unstable_by_key(|s| s.duration);
result
}
}