Implement Display trait (#6929)
This commit is contained in:
@ -1,14 +1,16 @@
|
|||||||
use solana_sdk::timing::duration_as_ns;
|
use solana_sdk::timing::duration_as_ns;
|
||||||
use std::time::Instant;
|
use std::{fmt, time::Instant};
|
||||||
|
|
||||||
pub struct Measure {
|
pub struct Measure {
|
||||||
|
name: &'static str,
|
||||||
start: Instant,
|
start: Instant,
|
||||||
duration: u64,
|
duration: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Measure {
|
impl Measure {
|
||||||
pub fn start(_name: &'static str) -> Self {
|
pub fn start(name: &'static str) -> Self {
|
||||||
Self {
|
Self {
|
||||||
|
name,
|
||||||
start: Instant::now(),
|
start: Instant::now(),
|
||||||
duration: 0,
|
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)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@ -46,4 +64,38 @@ mod tests {
|
|||||||
assert!(measure.as_ms() >= 990 && measure.as_ms() <= 1_010);
|
assert!(measure.as_ms() >= 990 && measure.as_ms() <= 1_010);
|
||||||
assert!(measure.as_us() >= 999_000 && measure.as_us() <= 1_010_000);
|
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