High-Resolution Monotonic Timer

Available since PHP 4, the microtime() function returns the current Unix timestamp with microseconds:

var_dump(microtime());
var_dump(microtime(true));

Executing the code shown above will print the output shown below:

string(21) "0.10677600 1586956167"
float(1586956167.1068)

Without the true argument, microtime() returns a string in the format “microseconds seconds” where the latter is the number of seconds since the Unix epoch, and the former is the number of microseconds since “seconds”.

With the true argument, microtime() returns a float value that represents the number of seconds since the Unix epoch with microsecond granularity.

The microtime() function looks at the system clock to perform its task. Depending on the use case, for instance when you want to measure performance, this may be problematic.

A common use case for microtime() is measuring the time between two points in time:

$start = microtime(true);

// ... do something ...

$end = microtime(true);

$elapsed = $end - $start;

The intent of the code shown above is that $elapsed contains the time, in microseconds, that passed between the two points in time where microtime() was invoked.

If the system clock is changed between the two invocations of microtime() then the result in $elapsed will be wrong. The hrtime() function was introduced in PHP 7.3 to solve this problem.

hrtime() implements a so called high-resolution monotonic timer. The “high-resolution” part refers to the fact that the time resolution of hrtime() is nanoseconds where microtime() only has microsecond resolution. “monotonic” is a reference to the concept of “monotonic functions” in mathematics: a function is monotonic when its values are either entirely non-increasing or entirely non-decreasing.

The values returned by the hrtime() function are monotonically increasing, meaning they always increase (or stay the same) and never decrease.

var_dump(hrtime());
var_dump(hrtime(true));

Executing the code shown above will print the output shown below:

array(2) {
  [0]=>
  int(30955)
  [1]=>
  int(926320146)
}
int(30955926404559)

hrtime() returns a timestamp at an unspecified point in the past. Without the true argument, this timestamp is represented as an array where the first element contains the number of seconds whereas the second element contains the number of nanoseconds.

With the true argument, hrtime() returns the timestamp as nanoseconds. On a 64-bit system the returned timestamp is an integer, on a 32-bit system it is a float.

hrtime() does not depend on the system clock to perform its job. Even if the system clock is changed between the two invocations of hrtime() then the result in $elapsed will still be correct:

$start = hrtime(true);

// ... do something ...

$end = hrtime(true);

$elapsed = $end - $start;

Furthermore, the value of $elapsed is now more accurate which is important when taking performance measurements.