#[derive(Debug, Clone)]
pub struct PoolStats {
pub available: usize,
pub total_allocated: usize,
pub total_acquired: usize,
pub total_returned: usize,
pub buffer_size: usize,
pub max_pool_size: usize,
}
impl PoolStats {
pub fn in_use(&self) -> usize {
self.total_acquired.saturating_sub(self.total_returned)
}
pub fn hit_rate(&self) -> f64 {
if self.total_acquired == 0 {
return 0.0;
}
let reused = self.total_acquired.saturating_sub(self.total_allocated);
(reused as f64 / self.total_acquired as f64) * 100.0
}
}
#[derive(Debug, Clone)]
pub struct FastPoolStats {
pub available: usize,
pub allocated: usize,
pub acquired: usize,
pub returned: usize,
pub cache_hits: usize,
pub thread_local_lost: usize,
}
impl FastPoolStats {
pub fn in_use(&self) -> usize {
self.acquired.saturating_sub(self.returned)
}
pub fn cache_hit_rate(&self) -> f64 {
if self.acquired == 0 {
return 0.0;
}
(self.cache_hits as f64 / self.acquired as f64) * 100.0
}
pub fn pool_hit_rate(&self) -> f64 {
if self.acquired == 0 {
return 0.0;
}
let hits = self.acquired.saturating_sub(self.allocated);
(hits as f64 / self.acquired as f64) * 100.0
}
pub fn leaked_bytes(&self, buffer_size: usize) -> usize {
self.thread_local_lost * buffer_size
}
pub fn has_leak_concern(&self) -> bool {
if self.allocated == 0 {
return false;
}
let leak_rate = (self.thread_local_lost as f64 / self.allocated as f64) * 100.0;
leak_rate > 10.0
}
}