use std::cell::RefCell;
use std::io;
use std::io::Write;
use std::rc::Rc;
use std::time::Instant;
use log::info;
use log::warn;
#[derive(Default)]
pub struct Timing {
results: Rc<RefCell<Vec<(String, f32)>>>,
}
pub struct Timer {
name: String,
start: Instant,
results: Rc<RefCell<Vec<(String, f32)>>>,
registered: bool,
}
impl Timing {
pub fn new() -> Self {
Self {
results: Rc::new(RefCell::new(Vec::new())),
}
}
pub fn start(&mut self, name: &str) -> Timer {
Timer {
name: name.to_string(),
start: Instant::now(),
results: self.results.clone(),
registered: false,
}
}
pub fn print(&self) {
for (name, time) in self.results.borrow().iter() {
eprintln!("Time {name}: {time:.3}s");
}
}
pub fn print_yaml(&self, tool_name: &str, writer: &mut impl Write) -> io::Result<()> {
writeln!(writer, "- tool: {tool_name}")?;
writeln!(writer, " timing:")?;
for (name, time) in self.results.borrow().iter() {
writeln!(writer, " {name}: {time:.3}s")?;
}
Ok(())
}
}
impl Timer {
pub fn finish(&mut self) {
let time = self.start.elapsed().as_secs_f64();
info!("Time {}: {:.3}s", self.name, time);
self.results.borrow_mut().push((self.name.clone(), time as f32));
self.registered = true
}
}
impl Drop for Timer {
fn drop(&mut self) {
if !self.registered {
warn!("Timer {} was dropped before 'finish()'", self.name);
}
}
}