pub struct TimeMeter<C: Clock> { /* private fields */ }Expand description
A time meter for measuring elapsed time with millisecond precision.
This meter provides a simple and powerful tool for time measurement with the following features:
- Flexible clock source: Supports any clock implementing
Clocktrait via generic parameter - High precision: Uses
MonotonicClockby default, based onInstant - Easy to use: Provides simple start/stop interface
- Multiple output formats: Supports milliseconds, seconds, minutes, and human-readable format
- Speed calculation: Provides per-second and per-minute speed calculation
- Test-friendly: Supports injecting
MockClockfor unit testing
§Design Philosophy
TimeMeter uses dependency injection pattern through the Clock
trait. This design brings the following benefits:
- Production reliability: Uses
MonotonicClockby default, ensuring time measurement is not affected by system time adjustments - Test controllability: Can inject
MockClockfor deterministic time testing - Extensibility: Can implement custom
Clockto meet special requirements - Compatibility: Fully compatible with standard Java time API
§Default Clock Selection
If no clock is specified, this meter uses MonotonicClock as the
default clock instead of system clock. This is because:
MonotonicClockis based onInstant, providing monotonically increasing time- Not affected by system time adjustments (e.g., NTP sync, manual settings)
- More suitable for performance measurement and benchmarking scenarios
- Provides more stable and reliable results in most use cases
§Thread Safety
This type is not thread-safe. If you need to use it in a multi-threaded environment, you should create separate instances for each thread or use external synchronization mechanisms.
§Examples
use prism3_clock::meter::TimeMeter;
use std::thread;
use std::time::Duration as StdDuration;
// Basic usage
let mut meter = TimeMeter::new();
meter.start();
thread::sleep(StdDuration::from_millis(100));
meter.stop();
println!("Elapsed: {}", meter.readable_duration());
// Auto-start
let mut meter = TimeMeter::start_now();
thread::sleep(StdDuration::from_millis(50));
meter.stop();
// Real-time monitoring (without calling stop)
let mut meter = TimeMeter::start_now();
for _ in 0..5 {
thread::sleep(StdDuration::from_millis(10));
println!("Running: {}", meter.readable_duration());
}§Author
Haixing Hu
Implementations§
Source§impl<C: Clock> TimeMeter<C>
impl<C: Clock> TimeMeter<C>
Sourcepub fn with_clock(clock: C) -> Self
pub fn with_clock(clock: C) -> Self
Sourcepub fn with_clock_started(clock: C) -> Self
pub fn with_clock_started(clock: C) -> Self
Creates a new time meter with the specified clock and starts it immediately.
§Arguments
clock- The clock to use for time measurement
§Returns
A new TimeMeter instance that has already been started
§Examples
use prism3_clock::{MonotonicClock, meter::TimeMeter};
let clock = MonotonicClock::new();
let meter = TimeMeter::with_clock_started(clock);Sourcepub fn start(&mut self)
pub fn start(&mut self)
Starts this meter.
Records the current time as the start timestamp. If the meter has already been started, this operation will restart timing.
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::new();
meter.start();Sourcepub fn stop(&mut self)
pub fn stop(&mut self)
Stops this meter.
Records the current time as the end timestamp. After calling this
method, duration() will return a fixed time interval until
start() or reset() is called again.
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.stop();Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Resets this meter.
Clears the start and end timestamps, restoring the meter to its
initial state. After reset, you need to call start() again to
begin a new time measurement.
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.stop();
meter.reset();Sourcepub fn restart(&mut self)
pub fn restart(&mut self)
Resets and immediately starts this meter.
This is equivalent to calling reset() followed by start().
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.restart();
// Do more workSourcepub fn millis(&self) -> i64
pub fn millis(&self) -> i64
Returns the elapsed duration in milliseconds.
If the meter has been stopped (by calling stop()), returns the
time interval from start to stop. If the meter has not been
stopped, returns the time interval from start to the current
moment.
If the meter has not been started (by calling start()), returns
0.
§Returns
The elapsed duration in milliseconds
§Examples
use prism3_clock::meter::TimeMeter;
use std::thread;
use std::time::Duration;
let mut meter = TimeMeter::start_now();
thread::sleep(Duration::from_millis(100));
assert!(meter.millis() >= 100);Sourcepub fn seconds(&self) -> i64
pub fn seconds(&self) -> i64
Returns the elapsed duration in seconds.
This method is based on the result of millis(), converting
milliseconds to seconds (rounded down).
§Returns
The elapsed duration in seconds
§Examples
use prism3_clock::meter::TimeMeter;
use std::thread;
use std::time::Duration;
let mut meter = TimeMeter::start_now();
thread::sleep(Duration::from_secs(2));
assert!(meter.seconds() >= 2);Sourcepub fn minutes(&self) -> i64
pub fn minutes(&self) -> i64
Returns the elapsed duration in minutes.
This method is based on the result of millis(), converting
milliseconds to minutes (rounded down).
§Returns
The elapsed duration in minutes
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::new();
meter.start();
// Simulate 2 minutes
meter.stop();
// In real usage, this would be >= 2 after 2 minutesSourcepub fn duration(&self) -> Duration
pub fn duration(&self) -> Duration
Returns the elapsed duration as a Duration object.
If the meter has been stopped (by calling stop()), returns the
time interval from start to stop. If the meter has not been
stopped, returns the time interval from start to the current
moment.
If the meter has not been started (by calling start()), returns
a zero duration.
§Returns
The elapsed duration as a Duration object (millisecond precision)
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
let duration = meter.duration();Sourcepub fn readable_duration(&self) -> String
pub fn readable_duration(&self) -> String
Returns a human-readable string representation of the elapsed duration.
Formats the duration into an easy-to-read string, such as “1h 23m 45s” or “2.5s”.
§Returns
A human-readable string representation of the duration
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.stop();
println!("Elapsed: {}", meter.readable_duration());Sourcepub fn speed_per_second(&self, count: usize) -> Option<f64>
pub fn speed_per_second(&self, count: usize) -> Option<f64>
Calculates the per-second speed for a given count.
Computes the average count processed per second during the elapsed time. Useful for performance monitoring and speed analysis.
§Arguments
count- The count value to calculate speed for
§Returns
The per-second speed, or None if the elapsed time is zero
§Examples
use prism3_clock::meter::TimeMeter;
use std::thread;
use std::time::Duration;
let mut meter = TimeMeter::start_now();
thread::sleep(Duration::from_secs(1));
meter.stop();
if let Some(speed) = meter.speed_per_second(1000) {
println!("Speed: {:.2} items/s", speed);
}Sourcepub fn speed_per_minute(&self, count: usize) -> Option<f64>
pub fn speed_per_minute(&self, count: usize) -> Option<f64>
Calculates the per-minute speed for a given count.
Computes the average count processed per minute during the elapsed time. Useful for performance monitoring and speed analysis.
§Arguments
count- The count value to calculate speed for
§Returns
The per-minute speed, or None if the elapsed time is zero
§Examples
use prism3_clock::meter::TimeMeter;
use std::thread;
use std::time::Duration;
let mut meter = TimeMeter::start_now();
thread::sleep(Duration::from_secs(1));
meter.stop();
if let Some(speed) = meter.speed_per_minute(1000) {
println!("Speed: {:.2} items/m", speed);
}Sourcepub fn formatted_speed_per_second(&self, count: usize) -> String
pub fn formatted_speed_per_second(&self, count: usize) -> String
Returns a formatted string of the per-second speed for a given count.
§Arguments
count- The count value to calculate speed for
§Returns
A string in the format “{speed}/s”, or “N/A” if the elapsed time is zero
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.stop();
println!("Speed: {}", meter.formatted_speed_per_second(1000));Sourcepub fn formatted_speed_per_minute(&self, count: usize) -> String
pub fn formatted_speed_per_minute(&self, count: usize) -> String
Returns a formatted string of the per-minute speed for a given count.
§Arguments
count- The count value to calculate speed for
§Returns
A string in the format “{speed}/m”, or “N/A” if the elapsed time is zero
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::start_now();
// Do some work
meter.stop();
println!("Speed: {}", meter.formatted_speed_per_minute(1000));Sourcepub fn is_running(&self) -> bool
pub fn is_running(&self) -> bool
Checks if the meter is currently running.
§Returns
true if the meter has been started but not stopped, false
otherwise
§Examples
use prism3_clock::meter::TimeMeter;
let mut meter = TimeMeter::new();
assert!(!meter.is_running());
meter.start();
assert!(meter.is_running());
meter.stop();
assert!(!meter.is_running());Sourcepub fn is_stopped(&self) -> bool
pub fn is_stopped(&self) -> bool
Source§impl TimeMeter<MonotonicClock>
impl TimeMeter<MonotonicClock>
Sourcepub fn new() -> Self
pub fn new() -> Self
Creates a new time meter using the default MonotonicClock.
The default clock uses MonotonicClock, which is based on
Instant and is not affected by system time adjustments, making
it more suitable for time measurement.
§Returns
A new TimeMeter instance
§Examples
use prism3_clock::meter::TimeMeter;
let meter = TimeMeter::new();