Get cache efficiency metrics
(&self)
| 323 | |
| 324 | /// Get cache efficiency metrics |
| 325 | pub fn efficiency_metrics(&self) -> CacheEfficiencyMetrics { |
| 326 | let stats = self.stats.read().unwrap(); |
| 327 | let entries = self.entries.read().unwrap(); |
| 328 | |
| 329 | let total_usage: u64 = entries.values().map(|e| e.usage_count).sum(); |
| 330 | let avg_usage = if entries.is_empty() { |
| 331 | 0.0 |
| 332 | } else { |
| 333 | total_usage as f64 / entries.len() as f64 |
| 334 | }; |
| 335 | |
| 336 | let memory_efficiency = if self.max_memory_bytes == 0 { |
| 337 | 0.0 |
| 338 | } else { |
| 339 | stats.current_memory_bytes as f64 / self.max_memory_bytes as f64 |
| 340 | }; |
| 341 | |
| 342 | CacheEfficiencyMetrics { |
| 343 | hit_rate: stats.hit_rate(), |
| 344 | memory_utilization: memory_efficiency, |
| 345 | average_entry_usage: avg_usage, |
| 346 | eviction_rate: if stats.hits + stats.misses == 0 { |
| 347 | 0.0 |
| 348 | } else { |
| 349 | stats.evictions as f64 / (stats.hits + stats.misses) as f64 |
| 350 | }, |
| 351 | compilation_time_saved_ms: stats.total_compilation_time_saved_ms, |
| 352 | } |
| 353 | } |
| 354 | } |
| 355 | |
| 356 | /// Cache efficiency metrics for monitoring |