50 lines
1.1 KiB
Rust
50 lines
1.1 KiB
Rust
use solana_sdk::timing::duration_as_ns;
|
|
use std::time::Instant;
|
|
|
|
pub struct Measure {
|
|
start: Instant,
|
|
duration: u64,
|
|
}
|
|
|
|
impl Measure {
|
|
pub fn start(_name: &'static str) -> Self {
|
|
Self {
|
|
start: Instant::now(),
|
|
duration: 0,
|
|
}
|
|
}
|
|
|
|
pub fn stop(&mut self) {
|
|
self.duration = duration_as_ns(&self.start.elapsed());
|
|
}
|
|
|
|
pub fn as_us(&self) -> u64 {
|
|
self.duration / 1000
|
|
}
|
|
|
|
pub fn as_ms(&self) -> u64 {
|
|
self.duration / (1000 * 1000)
|
|
}
|
|
|
|
pub fn as_s(&self) -> f32 {
|
|
self.duration as f32 / (1000.0f32 * 1000.0f32 * 1000.0f32)
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use std::thread::sleep;
|
|
use std::time::Duration;
|
|
|
|
#[test]
|
|
fn test_measure() {
|
|
let mut measure = Measure::start("test");
|
|
sleep(Duration::from_secs(1));
|
|
measure.stop();
|
|
assert!(measure.as_s() >= 0.99f32 && measure.as_s() <= 1.01f32);
|
|
assert!(measure.as_ms() >= 990 && measure.as_ms() <= 1_010);
|
|
assert!(measure.as_us() >= 999_000 && measure.as_us() <= 1_010_000);
|
|
}
|
|
}
|