ferrous_forge/performance/
mod.rs1pub mod cache;
10pub mod parallel;
11
12use std::sync::Arc;
13use std::time::Duration;
14
15#[derive(Debug, Clone)]
17pub struct PerformanceConfig {
18 pub parallel_enabled: bool,
20 pub thread_count: usize,
22 pub cache_enabled: bool,
24 pub cache_ttl: Duration,
26 pub lazy_parsing: bool,
28 pub memory_pool_size: usize,
30}
31
32impl Default for PerformanceConfig {
33 fn default() -> Self {
34 Self {
35 parallel_enabled: true,
36 thread_count: 0, cache_enabled: true,
38 cache_ttl: Duration::from_secs(300), lazy_parsing: true,
40 memory_pool_size: 100, }
42 }
43}
44
45#[derive(Debug, Clone, Default)]
47pub struct PerformanceMetrics {
48 pub validation_time_ms: u64,
50 pub memory_usage_bytes: u64,
52 pub files_processed: usize,
54 pub cache_hit_rate: f64,
56 pub parallel_speedup: f64,
58}
59
60impl PerformanceMetrics {
61 pub fn meets_targets(&self) -> bool {
63 self.validation_time_ms < 2000 && self.memory_usage_bytes < 100 * 1024 * 1024 }
66
67 pub fn report(&self) -> String {
69 format!(
70 "Performance Metrics:\n\
71 - Validation time: {}ms\n\
72 - Memory usage: {:.2}MB\n\
73 - Files processed: {}\n\
74 - Cache hit rate: {:.1}%\n\
75 - Parallel speedup: {:.2}x",
76 self.validation_time_ms,
77 self.memory_usage_bytes as f64 / (1024.0 * 1024.0),
78 self.files_processed,
79 self.cache_hit_rate * 100.0,
80 self.parallel_speedup
81 )
82 }
83}
84
85pub struct PerformanceMonitor {
87 #[allow(dead_code)]
88 config: Arc<PerformanceConfig>,
89 metrics: Arc<dashmap::DashMap<String, PerformanceMetrics>>,
90}
91
92impl PerformanceMonitor {
93 pub fn new(config: PerformanceConfig) -> Self {
95 Self {
96 config: Arc::new(config),
97 metrics: Arc::new(dashmap::DashMap::new()),
98 }
99 }
100
101 pub fn start_task(&self, task_name: &str) -> TaskMonitor {
103 TaskMonitor::new(task_name.to_string(), self.metrics.clone())
104 }
105
106 pub fn get_metrics(&self, task_name: &str) -> Option<PerformanceMetrics> {
108 self.metrics.get(task_name).map(|m| m.clone())
109 }
110
111 pub fn all_metrics(&self) -> Vec<(String, PerformanceMetrics)> {
113 self.metrics
114 .iter()
115 .map(|entry| (entry.key().clone(), entry.value().clone()))
116 .collect()
117 }
118}
119
120pub struct TaskMonitor {
122 task_name: String,
123 start_time: std::time::Instant,
124 metrics_map: Arc<dashmap::DashMap<String, PerformanceMetrics>>,
125}
126
127impl TaskMonitor {
128 fn new(
129 task_name: String,
130 metrics_map: Arc<dashmap::DashMap<String, PerformanceMetrics>>,
131 ) -> Self {
132 Self {
133 task_name,
134 start_time: std::time::Instant::now(),
135 metrics_map,
136 }
137 }
138
139 pub fn complete(self, files_processed: usize) {
141 let elapsed = self.start_time.elapsed();
142 let metrics = PerformanceMetrics {
143 validation_time_ms: elapsed.as_millis() as u64,
144 memory_usage_bytes: estimate_memory_usage(),
145 files_processed,
146 cache_hit_rate: 0.0, parallel_speedup: 1.0, };
149 self.metrics_map.insert(self.task_name, metrics);
150 }
151}
152
153fn estimate_memory_usage() -> u64 {
155 let thread_count = rayon::current_num_threads();
160 let base_memory = 20 * 1024 * 1024; let per_thread = 5 * 1024 * 1024; base_memory + (thread_count as u64 * per_thread)
164}
165
166#[cfg(test)]
167mod tests {
168 use super::*;
169
170 #[test]
171 fn test_performance_config_default() {
172 let config = PerformanceConfig::default();
173 assert!(config.parallel_enabled);
174 assert!(config.cache_enabled);
175 assert_eq!(config.thread_count, 0);
176 }
177
178 #[test]
179 fn test_performance_metrics() {
180 let metrics = PerformanceMetrics {
181 validation_time_ms: 1500,
182 memory_usage_bytes: 50 * 1024 * 1024,
183 ..Default::default()
184 };
185
186 assert!(metrics.meets_targets());
187
188 let metrics = PerformanceMetrics {
189 validation_time_ms: 3000,
190 memory_usage_bytes: 50 * 1024 * 1024,
191 ..Default::default()
192 };
193 assert!(!metrics.meets_targets());
194 }
195
196 #[test]
197 fn test_performance_monitor() {
198 let config = PerformanceConfig::default();
199 let monitor = PerformanceMonitor::new(config);
200
201 let task = monitor.start_task("test_task");
202 task.complete(10);
203
204 let metrics = monitor.get_metrics("test_task");
205 assert!(metrics.is_some());
206 }
207}