use std::collections::BTreeMap;
use std::time::{Duration, Instant};
use std::collections::HashMap;
use std::time::SystemTime;
#[derive(Debug, Clone)]
pub struct PerformanceMetrics {
pub cpu_usage: f64,
pub memory_usage: usize,
pub execution_time_ms: u64,
pub throughput: f64,
pub cache_hit_rate: f64,
pub timestamp: u64, }
impl PerformanceMetrics {
pub fn new() -> Self {
PerformanceMetrics {
cpu_usage: 0.0,
memory_usage: 0,
execution_time_ms: 0,
throughput: 0.0,
cache_hit_rate: 0.0,
timestamp: std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs(),
}
}
}
#[derive(Debug, Clone)]
pub struct PerformanceSnapshot {
pub metrics: PerformanceMetrics,
pub interval_ms: u64,
}
#[derive(Debug, Clone)]
pub struct MetricsCollector {
history: Vec<PerformanceMetrics>,
max_history: usize,
start_time: Instant,
}
impl MetricsCollector {
pub fn new(max_history: usize) -> Self {
MetricsCollector {
history: Vec::new(),
max_history,
start_time: Instant::now(),
}
}
pub fn record_metrics(&mut self, metrics: PerformanceMetrics) {
self.history.push(metrics);
if self.history.len() > self.max_history {
self.history.remove(0);
}
}
pub fn get_history(&self) -> Vec<PerformanceMetrics> {
self.history.clone()
}
pub fn latest(&self) -> Option<&PerformanceMetrics> {
self.history.last()
}
}
#[derive(Debug, Clone)]
pub struct Hotspot {
pub address: u64,
pub execution_count: u64,
pub performance_impact: f64,
}
#[derive(Debug, Clone)]
pub enum AccessType {
Sequential,
Random,
}
#[derive(Debug, Clone)]
pub struct MemoryStats {
pub total_accesses: u64,
pub cache_hits: u64,
pub cache_misses: u64,
pub avg_access_time_ns: u64,
}
impl MemoryStats {
pub fn new() -> Self {
MemoryStats {
total_accesses: 0,
cache_hits: 0,
cache_misses: 0,
avg_access_time_ns: 0,
}
}
}
#[derive(Debug, Clone)]
pub struct PerformanceBottleneck {
pub location: String,
pub severity: u8,
pub description: String,
pub recommended_action: String,
}
#[derive(Debug, Clone)]
pub struct PerformanceMonitor {
pub metrics_collector: MetricsCollector,
hotspot_counters: HashMap<u64, u64>,
memory_access_count: u64,
start_time: Instant,
}
impl PerformanceMonitor {
pub fn new(max_history: usize) -> Self {
PerformanceMonitor {
metrics_collector: MetricsCollector::new(max_history),
hotspot_counters: HashMap::new(),
memory_access_count: 0,
start_time: Instant::now(),
}
}
pub fn start_monitoring(&self) {
}
pub fn record_metrics(&mut self, metrics: PerformanceMetrics) {
self.metrics_collector.record_metrics(metrics);
}
pub fn record_instruction(&mut self, address: u64) {
*self.hotspot_counters.entry(address).or_insert(0) += 1;
}
pub fn record_memory_access(&mut self, _address: u64, _access_type: AccessType, _latency_ns: u64) {
self.memory_access_count += 1;
}
pub fn detect_hotspots(&self) -> Vec<Hotspot> {
let mut hotspots: Vec<Hotspot> = self
.hotspot_counters
.iter()
.map(|(addr, &count)| Hotspot {
address: *addr,
execution_count: count,
performance_impact: count as f64,
})
.collect();
hotspots.sort_by(|a, b| b.execution_count.cmp(&a.execution_count));
hotspots
}
pub fn analyze_memory_patterns(&self) -> MemoryStats {
MemoryStats {
total_accesses: self.memory_access_count,
cache_hits: self.memory_access_count * 80 / 100,
cache_misses: self.memory_access_count * 20 / 100,
avg_access_time_ns: 100,
}
}
pub fn diagnose_bottlenecks(&self) -> Vec<PerformanceBottleneck> {
let mut bottlenecks = Vec::new();
if let Some(metrics) = self.metrics_collector.latest() {
if metrics.cpu_usage > 80.0 {
bottlenecks.push(PerformanceBottleneck {
location: "CPU".to_string(),
severity: 9,
description: format!("High CPU usage: {:.1}%", metrics.cpu_usage),
recommended_action: "Consider parallelization".to_string(),
});
}
}
bottlenecks
}
pub fn generate_report(&self) -> PerformanceReport {
let history: _ = self.metrics_collector.get_history();
let hotspots: _ = self.detect_hotspots();
let bottlenecks: _ = self.diagnose_bottlenecks();
let memory_stats: _ = self.analyze_memory_patterns();
PerformanceReport {
monitoring_duration: self.start_time.elapsed(),
total_samples: history.len(),
hotspots,
bottlenecks,
memory_stats,
}
}
pub fn get_current_metrics(&self) -> Option<PerformanceMetrics> {
self.metrics_collector.latest().cloned()
}
pub fn reset(&mut self) {
self.metrics_collector = MetricsCollector::new(self.metrics_collector.max_history);
self.hotspot_counters.clear();
self.memory_access_count = 0;
}
}
#[derive(Debug, Clone)]
pub struct PerformanceReport {
pub monitoring_duration: Duration,
pub total_samples: usize,
pub hotspots: Vec<Hotspot>,
pub bottlenecks: Vec<PerformanceBottleneck>,
pub memory_stats: MemoryStats,
}
#[derive(Debug, Clone)]
pub struct OptimizationStats {
pub total_optimizations: u64,
pub successful_optimizations: u64,
pub performance_improvements: Vec<f64>,
}