Precise timings with `monotonic_time`
Monotonic time is time from a clock that only moves forward. The system clock on your CPU can be set and reset. Even when tied to the LAN ntp protocol the system clock can be out-of-sync by a couple of milliseconds. When measuring in microseconds, that's a lot of time, and time drift can occur at the microsecond level even when attached to NTP, requiring system clock resets.
To get monotonic time in Elixir use, System.monotonic_time
:
iex> System.monotonic_time
-576460718338896000
iex> System.monotonic_time
-576460324867892860
It's ok that this number is negative, it's always moving positive.
The number has a time unit of :native
. To get a duration in millseconds you could convert from :native
to millisecond
.
iex> event_time = System.monotonic_time
-576459417748861340
iex> System.convert_time_unit(System.monotonic_time - event_time, :native, :millisecond)
38803
Or you could get a millisecond duration by using the one argument of monotonic_time
to specify the time unit you want.
iex> event_time = System.monotonic_time(:millisecond)
-576459079381
iex> System.monotonic_time(:millisecond) - event_time
14519
Check out the elixir docs on time for more info.
Tweet