Implement Display trait (#6929)
This commit is contained in:
		@@ -1,14 +1,16 @@
 | 
			
		||||
use solana_sdk::timing::duration_as_ns;
 | 
			
		||||
use std::time::Instant;
 | 
			
		||||
use std::{fmt, time::Instant};
 | 
			
		||||
 | 
			
		||||
pub struct Measure {
 | 
			
		||||
    name: &'static str,
 | 
			
		||||
    start: Instant,
 | 
			
		||||
    duration: u64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Measure {
 | 
			
		||||
    pub fn start(_name: &'static str) -> Self {
 | 
			
		||||
    pub fn start(name: &'static str) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            name,
 | 
			
		||||
            start: Instant::now(),
 | 
			
		||||
            duration: 0,
 | 
			
		||||
        }
 | 
			
		||||
@@ -31,6 +33,22 @@ impl Measure {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl fmt::Display for Measure {
 | 
			
		||||
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 | 
			
		||||
        if self.duration == 0 {
 | 
			
		||||
            write!(f, "{} running", self.name)
 | 
			
		||||
        } else if self.as_us() < 1 {
 | 
			
		||||
            write!(f, "{} took {}ns", self.name, self.duration)
 | 
			
		||||
        } else if self.as_ms() < 1 {
 | 
			
		||||
            write!(f, "{} took {}us", self.name, self.as_us())
 | 
			
		||||
        } else if self.as_s() < 1. {
 | 
			
		||||
            write!(f, "{} took {}ms", self.name, self.as_ms())
 | 
			
		||||
        } else {
 | 
			
		||||
            write!(f, "{} took {:.1}s", self.name, self.as_s())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
    use super::*;
 | 
			
		||||
@@ -46,4 +64,38 @@ mod tests {
 | 
			
		||||
        assert!(measure.as_ms() >= 990 && measure.as_ms() <= 1_010);
 | 
			
		||||
        assert!(measure.as_us() >= 999_000 && measure.as_us() <= 1_010_000);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn test_measure_display() {
 | 
			
		||||
        let measure = Measure {
 | 
			
		||||
            name: "test_ns",
 | 
			
		||||
            start: Instant::now(),
 | 
			
		||||
            duration: 1,
 | 
			
		||||
        };
 | 
			
		||||
        assert_eq!(format!("{}", measure), "test_ns took 1ns");
 | 
			
		||||
 | 
			
		||||
        let measure = Measure {
 | 
			
		||||
            name: "test_us",
 | 
			
		||||
            start: Instant::now(),
 | 
			
		||||
            duration: 1000,
 | 
			
		||||
        };
 | 
			
		||||
        assert_eq!(format!("{}", measure), "test_us took 1us");
 | 
			
		||||
 | 
			
		||||
        let measure = Measure {
 | 
			
		||||
            name: "test_ms",
 | 
			
		||||
            start: Instant::now(),
 | 
			
		||||
            duration: 1000 * 1000,
 | 
			
		||||
        };
 | 
			
		||||
        assert_eq!(format!("{}", measure), "test_ms took 1ms");
 | 
			
		||||
 | 
			
		||||
        let measure = Measure {
 | 
			
		||||
            name: "test_s",
 | 
			
		||||
            start: Instant::now(),
 | 
			
		||||
            duration: 1000 * 1000 * 1000,
 | 
			
		||||
        };
 | 
			
		||||
        assert_eq!(format!("{}", measure), "test_s took 1.0s");
 | 
			
		||||
 | 
			
		||||
        let measure = Measure::start("test_not_stopped");
 | 
			
		||||
        assert_eq!(format!("{}", measure), "test_not_stopped running");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user