W3docs

hrtime()

En este artículo nos enfocamos en la función PHP hrtime(): qué hace, cómo funciona y ejemplos de su uso.

Este artículo cubre la función PHP hrtime(): qué hace, en qué se diferencian sus dos modos de retorno, por qué su reloj monotónico la convierte en la herramienta ideal para benchmarking, y ejemplos que puedes ejecutar.

Introducción a la función hrtime()

hrtime() es una función integrada disponible en PHP 7.3 y versiones posteriores. Lee el temporizador de alta resolución del sistema y devuelve la hora actual con precisión de nanosegundos. Su propósito principal es el benchmarking — medir cuánto tiempo tarda en ejecutarse un fragmento de código.

La palabra clave es monotónico. Un reloj monotónico solo avanza a una velocidad constante; no se ve afectado por cambios en el reloj del sistema, ajustes NTP ni transiciones por horario de verano. Eso es exactamente lo que se necesita para medir el tiempo transcurrido. Las funciones de reloj de pared como microtime() y time() pueden saltar hacia atrás o hacia adelante si el reloj del sistema se corrige en medio de una medición, lo que corrompería un benchmark.

Ten en cuenta que hrtime() mide el tiempo desde una época arbitraria (generalmente el arranque del sistema). El valor absoluto carece de significado por sí solo — solo es útil como diferencia entre dos lecturas.

Sintaxis y valores de retorno

hrtime(bool $as_number = false): array|int|false
  • $as_number — cuando es false (valor predeterminado), devuelve un array de dos elementos [seconds, nanoseconds]. Cuando es true, devuelve un entero único: el tiempo total en nanosegundos.
  • Devuelve false si el temporizador de alta resolución no está disponible.

La forma de entero único (hrtime(true)) es la más conveniente para benchmarking, ya que puedes restar dos lecturas directamente.

Benchmarking con hrtime(true)

php— editable, runs on the server

La lógica es: capturar $start, ejecutar el código, capturar $end y luego tomar la diferencia. Dado que las lecturas están en nanosegundos, divide entre 1e6 (1.000.000) para obtener milisegundos, o entre 1e9 para obtener segundos. El resultado para una pausa de 1,5 ms será aproximadamente 1.5 ms (el valor exacto varía ligeramente según la sobrecarga del sistema).

Lectura del array [seconds, nanoseconds]

Llamada sin argumento, hrtime() devuelve un array que puedes desestructurar:

<?php
[$seconds, $nanoseconds] = hrtime();

echo "Seconds since epoch:     $seconds\n";
echo "Nanoseconds component:   $nanoseconds\n";

// Combine both parts into total nanoseconds yourself
$totalNs = $seconds * 1e9 + $nanoseconds;
echo "Total nanoseconds:       $totalNs\n";
?>

Esta forma rara vez se necesita en la práctica — hrtime(true) ya te da el valor combinado — pero muestra qué está reportando realmente el temporizador.

Cuándo usar hrtime() vs microtime()

  • Usa hrtime() para micro-benchmarks y cualquier medición donde la precisión sea importante. Es monotónico y ofrece resolución de nanosegundos.
  • Usa microtime() cuando necesites una marca de tiempo de reloj de pared (segundos desde la época Unix) en lugar de una duración transcurrida.

Advertencias

  • Precisión con aritmética de punto flotante. Dividir nanosegundos entre 1e6 produce un float, que está bien para visualización pero puede perder precisión en intervalos muy largos. Mantén la diferencia en nanosegundos enteros mientras mides y conviértela solo al final.
  • Scripts de muy larga duración. En una compilación de 32 bits, el entero de nanosegundos puede desbordarse. Para diferencias arbitrariamente grandes, usa las extensiones bcmath o gmp para aritmética precisa.
  • No trates el valor como una fecha. No es una marca de tiempo Unix; no puedes formatearlo con date().

Conclusión

hrtime() es la herramienta adecuada para medir cuánto tarda en ejecutarse el código PHP. Usa hrtime(true) para capturar una lectura en nanosegundos antes y después del código, réstala y conviértela a la unidad que prefieras. Su reloj monotónico hace que el resultado sea confiable incluso cuando el reloj del sistema cambia — algo que microtime() no puede garantizar.

Práctica

Práctica
¿Cuál es el propósito de la función hrtime() en PHP?
¿Cuál es el propósito de la función hrtime() en PHP?
Was this page helpful?