use std::time::{Duration, SystemTime, SystemTimeError};
pub struct Profile {
name: String,
start: SystemTime,
time_taken: Option<Duration>,
}
impl Profile {
pub fn new<S: AsRef<str>>(name: S) -> Self {
Self {
name: name.as_ref().to_owned(),
start: SystemTime::now(),
time_taken: None,
}
}
pub fn elapsed(&mut self) -> Result<u128, SystemTimeError> {
self.elapsed_duration().map(|d| d.as_millis())
}
pub fn elapsed_duration(&mut self) -> Result<Duration, SystemTimeError> {
if let Some(d) = self.time_taken {
Ok(d)
} else {
let d = self.start.elapsed()?;
self.time_taken = Some(d);
Ok(d)
}
}
pub fn name(&self) -> &str {
&self.name
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn elapsed_millis() {
let mut profile = Profile::new("fake network request");
std::thread::sleep(Duration::from_secs_f64(0.25));
let elapsed = profile.elapsed().expect("time went backwards!");
assert!(elapsed >= 250);
println!("`{}` took {elapsed} milliseconds", profile.name());
}
}