use std::time::Instant;
use super::advanced_profiler_types::{
CollectionStats, MetricDataPoint, PerformanceCollector, PerformanceTracker, TrackerState,
};
impl Default for PerformanceCollector {
fn default() -> Self {
Self::new()
}
}
impl PerformanceCollector {
pub fn new() -> Self {
Self {
buffer: std::collections::VecDeque::new(),
stats: CollectionStats::default(),
trackers: std::collections::HashMap::new(),
}
}
pub fn add_metric(&mut self, metric: MetricDataPoint) {
if self.buffer.len() >= 100_000 {
self.buffer.pop_front();
self.stats.drop_rate += 1.0;
}
self.buffer.push_back(metric);
self.stats.total_points += 1;
self.stats.memory_usage_bytes =
(self.buffer.len() * std::mem::size_of::<MetricDataPoint>()) as u64;
}
pub fn start_tracker(&mut self, name: String) -> String {
let tracker = PerformanceTracker {
name: name.clone(),
start_time: Instant::now(),
measurements: Vec::new(),
state: TrackerState::Active,
};
self.trackers.insert(name.clone(), tracker);
name
}
pub fn stop_tracker(&mut self, name: &str) -> Option<PerformanceTracker> {
if let Some(mut tracker) = self.trackers.remove(name) {
tracker.state = TrackerState::Stopped;
Some(tracker)
} else {
None
}
}
}