pub struct Instant(_);Expand description
A measurement of a monotonically nondecreasing clock.
Opaque and useful only with Duration.
Instants are always guaranteed, barring platform bugs, to be no less than any previously measured instant when created, and are often useful for tasks such as measuring benchmarks or timing how long an operation takes.
Note, however, that instants are not guaranteed to be steady. In other words, each tick of the underlying clock might not be the same length (e.g. some seconds may be longer than others). An instant may jump forwards or experience time dilation (slow down or speed up), but it will never go backwards.
Instants are opaque types that can only be compared to one another. There is no method to get “the number of seconds” from an instant. Instead, it only allows measuring the duration between two instants (or comparing two instants).
The size of an Instant struct may vary depending on the target operating
system.
Example:
use std::time::{Duration, Instant};
use std::thread::sleep;
fn main() {
let now = Instant::now();
// we sleep for 2 seconds
sleep(Duration::new(2, 0));
// it prints '2'
println!("{}", now.elapsed().as_secs());
}RunOS-specific behaviors
An Instant is a wrapper around system-specific types and it may behave
differently depending on the underlying operating system. For example,
the following snippet is fine on Linux but panics on macOS:
use std::time::{Instant, Duration};
let now = Instant::now();
let max_nanoseconds = u64::MAX / 1_000_000_000;
let duration = Duration::new(max_nanoseconds, 0);
println!("{:?}", now + duration);RunUnderlying System calls
The following system calls are currently being used by now() to find out
the current time:
| Platform | System call |
|---|---|
| SGX | insecure_time usercall. More information on timekeeping in SGX |
| UNIX | clock_gettime (Monotonic Clock) |
| Darwin | mach_absolute_time |
| VXWorks | clock_gettime (Monotonic Clock) |
| SOLID | get_tim |
| WASI | __wasi_clock_time_get (Monotonic Clock) |
| Windows | QueryPerformanceCounter |
Disclaimer: These system calls might change over time.
Note: mathematical operations like
addmay panic if the underlying structure cannot represent the new point in time.
Monotonicity
On all platforms Instant will try to use an OS API that guarantees monotonic behavior
if available, which is the case for all tier 1 platforms.
In practice such guarantees are – under rare circumstances – broken by hardware, virtualization
or operating system bugs. To work around these bugs and platforms not offering monotonic clocks
duration_since, elapsed and sub saturate to zero. In older Rust versions this
lead to a panic instead. checked_duration_since can be used to detect and handle situations
where monotonicity is violated, or Instants are subtracted in the wrong order.
This workaround obscures programming errors where earlier and later instants are accidentally swapped. For this reason future rust versions may reintroduce panics.
Implementations
impl Instant
source
impl Instant
sourcepub fn duration_since(&self, earlier: Instant) -> Duration
source
pub fn duration_since(&self, earlier: Instant) -> Duration
sourceReturns the amount of time elapsed from another instant to this one, or zero duration if that instant is later than this one.
Panics
Previous rust versions panicked when earlier was later than self. Currently this
method saturates. Future versions may reintroduce the panic in some circumstances.
See Monotonicity.
Examples
use std::time::{Duration, Instant};
use std::thread::sleep;
let now = Instant::now();
sleep(Duration::new(1, 0));
let new_now = Instant::now();
println!("{:?}", new_now.duration_since(now));
println!("{:?}", now.duration_since(new_now)); // 0nsRunpub fn checked_duration_since(&self, earlier: Instant) -> Option<Duration>
1.39.0 · source
pub fn checked_duration_since(&self, earlier: Instant) -> Option<Duration>
1.39.0 · sourceReturns the amount of time elapsed from another instant to this one, or None if that instant is later than this one.
Due to monotonicity bugs, even under correct logical ordering of the passed Instants,
this method can return None.
Examples
use std::time::{Duration, Instant};
use std::thread::sleep;
let now = Instant::now();
sleep(Duration::new(1, 0));
let new_now = Instant::now();
println!("{:?}", new_now.checked_duration_since(now));
println!("{:?}", now.checked_duration_since(new_now)); // NoneRunpub fn saturating_duration_since(&self, earlier: Instant) -> Duration
1.39.0 · source
pub fn saturating_duration_since(&self, earlier: Instant) -> Duration
1.39.0 · sourceReturns the amount of time elapsed from another instant to this one, or zero duration if that instant is later than this one.
Examples
use std::time::{Duration, Instant};
use std::thread::sleep;
let now = Instant::now();
sleep(Duration::new(1, 0));
let new_now = Instant::now();
println!("{:?}", new_now.saturating_duration_since(now));
println!("{:?}", now.saturating_duration_since(new_now)); // 0nsRunpub fn elapsed(&self) -> Duration
source
pub fn elapsed(&self) -> Duration
sourceReturns the amount of time elapsed since this instant was created.
Panics
Previous rust versions panicked when self was earlier than the current time. Currently this method returns a Duration of zero in that case. Future versions may reintroduce the panic. See Monotonicity.
Examples
use std::thread::sleep;
use std::time::{Duration, Instant};
let instant = Instant::now();
let three_secs = Duration::from_secs(3);
sleep(three_secs);
assert!(instant.elapsed() >= three_secs);Runpub fn checked_add(&self, duration: Duration) -> Option<Instant>
1.34.0 · source
pub fn checked_add(&self, duration: Duration) -> Option<Instant>
1.34.0 · sourceReturns Some(t) where t is the time self + duration if t can be represented as
Instant (which means it’s inside the bounds of the underlying data structure), None
otherwise.
pub fn checked_sub(&self, duration: Duration) -> Option<Instant>
1.34.0 · source
pub fn checked_sub(&self, duration: Duration) -> Option<Instant>
1.34.0 · sourceReturns Some(t) where t is the time self - duration if t can be represented as
Instant (which means it’s inside the bounds of the underlying data structure), None
otherwise.
Trait Implementations
impl AddAssign<Duration> for Instant
1.9.0 · source
impl AddAssign<Duration> for Instant
1.9.0 · sourcefn add_assign(&mut self, other: Duration)
source
fn add_assign(&mut self, other: Duration)
sourcePerforms the += operation. Read more
impl Ord for Instant
source
impl Ord for Instant
sourceimpl PartialOrd<Instant> for Instant
source
impl PartialOrd<Instant> for Instant
sourcefn partial_cmp(&self, other: &Instant) -> Option<Ordering>
source
fn partial_cmp(&self, other: &Instant) -> Option<Ordering>
sourceThis method returns an ordering between self and other values if one exists. Read more
fn lt(&self, other: &Rhs) -> bool
1.0.0 · source
fn lt(&self, other: &Rhs) -> bool
1.0.0 · sourceThis method tests less than (for self and other) and is used by the < operator. Read more
fn le(&self, other: &Rhs) -> bool
1.0.0 · source
fn le(&self, other: &Rhs) -> bool
1.0.0 · sourceThis method tests less than or equal to (for self and other) and is used by the <=
operator. Read more
impl Sub<Instant> for Instant
source
impl Sub<Instant> for Instant
sourcefn sub(self, other: Instant) -> Duration
source
fn sub(self, other: Instant) -> Duration
sourceReturns the amount of time elapsed from another instant to this one, or zero duration if that instant is later than this one.
Panics
Previous rust versions panicked when other was later than self. Currently this
method saturates. Future versions may reintroduce the panic in some circumstances.
See Monotonicity.
impl SubAssign<Duration> for Instant
1.9.0 · source
impl SubAssign<Duration> for Instant
1.9.0 · sourcefn sub_assign(&mut self, other: Duration)
source
fn sub_assign(&mut self, other: Duration)
sourcePerforms the -= operation. Read more
impl Copy for Instant
sourceimpl Eq for Instant
sourceimpl StructuralEq for Instant
sourceimpl StructuralPartialEq for Instant
sourceAuto Trait Implementations
impl RefUnwindSafe for Instant
impl Send for Instant
impl Sync for Instant
impl Unpin for Instant
impl UnwindSafe for Instant
Blanket Implementations
impl<T> BorrowMut<T> for T where
T: ?Sized,
source
impl<T> BorrowMut<T> for T where
T: ?Sized,
sourcefn borrow_mut(&mut self) -> &mut T
const: unstable · source
fn borrow_mut(&mut self) -> &mut T
const: unstable · sourceMutably borrows from an owned value. Read more
impl<T> ToOwned for T where
T: Clone,
source
impl<T> ToOwned for T where
T: Clone,
sourcetype Owned = T
type Owned = T
The resulting type after obtaining ownership.
fn clone_into(&self, target: &mut T)
source
fn clone_into(&self, target: &mut T)
sourceUses borrowed data to replace owned data, usually by cloning. Read more