use crate::diagnostic::SystemMetrics;
use crate::probe::{PmuProbe, Snapshot};
pub struct Timer {
name: &'static str,
start: Snapshot,
}
impl Timer {
pub fn start(probe: &PmuProbe, name: &'static str) -> Self {
Self {
name,
start: probe.snapshot(),
}
}
pub fn stop(self, probe: &PmuProbe) -> SystemMetrics {
let end = probe.snapshot();
let delta = probe.delta(&self.start, &end);
SystemMetrics {
name: self.name,
wall_ns: delta.wall_ns,
cycles: delta.cycles,
instructions: delta.instructions,
l1d_misses: delta.l1d_misses,
branch_misses: delta.branch_misses,
call_count: 1,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::probe::ProbeMode;
#[test]
fn timer_records_label_and_elapsed() {
let probe = PmuProbe::new(ProbeMode::Wall);
let t = Timer::start(&probe, "test_system");
std::thread::sleep(std::time::Duration::from_millis(1));
let m = t.stop(&probe);
assert_eq!(m.name, "test_system");
assert!(m.wall_ns > 0);
assert_eq!(m.call_count, 1);
}
}