pfs-time-measure initial commit
A library to quickly measure the time for some code.
This commit is contained in:
commit
6b58daa9cd
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/target
|
||||
Cargo.lock
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
||||
[package]
|
||||
name = "pfs-time-measure"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
96
src/lib.rs
Normal file
96
src/lib.rs
Normal file
@ -0,0 +1,96 @@
|
||||
use std::time::{Duration, Instant};
|
||||
|
||||
struct Measurement {
|
||||
start: Instant,
|
||||
finish: Instant,
|
||||
}
|
||||
|
||||
pub struct Clock {
|
||||
name: String,
|
||||
start: Option<Instant>,
|
||||
total_duration: Duration,
|
||||
measurements: Vec<Measurement>,
|
||||
}
|
||||
|
||||
impl Clock {
|
||||
pub fn new(name: String, immediately_start: bool) -> Clock {
|
||||
let start = if immediately_start {
|
||||
Some(Instant::now())
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
Clock {
|
||||
name,
|
||||
start,
|
||||
total_duration: Duration::default(),
|
||||
measurements: Vec::with_capacity(16),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn restart(&mut self) {
|
||||
self.start = Some(Instant::now());
|
||||
}
|
||||
|
||||
pub fn stop(&mut self) -> Option<Duration> {
|
||||
if !self.is_running() {
|
||||
return None;
|
||||
}
|
||||
|
||||
// get duration of this measurement
|
||||
let finish = Instant::now();
|
||||
let duration = finish.duration_since(self.start.unwrap());
|
||||
|
||||
// add duration to total duration
|
||||
self.total_duration += duration;
|
||||
|
||||
// add measurement to list of measurements
|
||||
self.measurements.push(Measurement {
|
||||
start: self.start.unwrap(),
|
||||
finish: finish,
|
||||
});
|
||||
|
||||
// reset
|
||||
self.start = None;
|
||||
|
||||
// return duration of this specific measurement
|
||||
Some(duration)
|
||||
}
|
||||
|
||||
pub fn stop_and_print(&mut self) {
|
||||
match self.stop() {
|
||||
Some(duration) => self.print_duration(duration),
|
||||
None => println!(
|
||||
"[CLOCK] {} cannot be stopped because timer wasn't running",
|
||||
self.name
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
fn is_running(&self) -> bool {
|
||||
self.start.is_some()
|
||||
}
|
||||
|
||||
fn print_duration(&self, duration: Duration) {
|
||||
let name = &self.name;
|
||||
let duration = duration.as_millis();
|
||||
let total_duration = self.total_duration.as_millis();
|
||||
println!("[CLOCK] {name} took {duration}ms (total {total_duration}ms)");
|
||||
}
|
||||
|
||||
pub fn print_total(&self) {
|
||||
self.print_duration(self.total_duration);
|
||||
}
|
||||
|
||||
pub fn print_all_measurements(&self) {
|
||||
for (idx, measurement) in self.measurements.iter().enumerate() {
|
||||
println!(
|
||||
"[CLOCK] {}/{}: {}ms",
|
||||
self.name,
|
||||
idx,
|
||||
measurement.finish.duration_since(measurement.start).as_millis()
|
||||
);
|
||||
}
|
||||
println!("[CLOCK] {}/total: {}ms", self.name, self.total_duration.as_millis());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user