use std::collections::HashMap;
use crate::{
alloc::ThreadAllocInfo,
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_info: ThreadAllocInfo,
pub counter_totals: [u128; KnownCounterKind::COUNT],
}
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_info_by_sample: HashMap<u32, ThreadAllocInfo>,
}
impl SampleCollection {
#[inline]
pub fn clear(&mut self) {
self.time_samples.clear();
self.alloc_info_by_sample.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
}
}