Add Measure abstraction over measuring time intervals (#4851)
Allows one to swap in different implementations. This provides the normal Insant::now() -> .elapsed() path.
This commit is contained in:
1
measure/.gitignore
vendored
Normal file
1
measure/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target/
|
14
measure/Cargo.toml
Normal file
14
measure/Cargo.toml
Normal file
@ -0,0 +1,14 @@
|
||||
[package]
|
||||
name = "solana-measure"
|
||||
description = "Blockchain, Rebuilt for Scale"
|
||||
version = "0.17.0"
|
||||
documentation = "https://docs.rs/solana"
|
||||
homepage = "https://solana.com/"
|
||||
readme = "../README.md"
|
||||
repository = "https://github.com/solana-labs/solana"
|
||||
authors = ["Solana Maintainers <maintainers@solana.com>"]
|
||||
license = "Apache-2.0"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
solana-sdk = { path = "../sdk", version = "0.17.0" }
|
1
measure/src/lib.rs
Normal file
1
measure/src/lib.rs
Normal file
@ -0,0 +1 @@
|
||||
pub mod measure;
|
49
measure/src/measure.rs
Normal file
49
measure/src/measure.rs
Normal file
@ -0,0 +1,49 @@
|
||||
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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user