use std::time::Duration;
const NUM_SAMPLES: usize = 10;
#[derive(Default)]
pub struct Meter {
times: [f64; NUM_SAMPLES],
avg: f64,
index: usize,
}
impl Meter {
pub fn average(&self) -> f64 {
self.avg
}
pub fn record(&mut self, duration: Duration) {
self.add_sample(duration);
}
fn add_sample(&mut self, sample: Duration) {
let mut usec = 0f64;
usec += f64::from(sample.subsec_nanos()) / 1e3;
usec += (sample.as_secs() as f64) * 1e6;
let prev = self.times[self.index];
self.times[self.index] = usec;
self.avg -= prev / NUM_SAMPLES as f64;
self.avg += usec / NUM_SAMPLES as f64;
self.index = (self.index + 1) % NUM_SAMPLES;
}
}