W3docs

hrtime()

Cet article présente la fonction PHP hrtime() : son fonctionnement, ses deux modes de retour et des exemples pratiques pour le benchmarking.

Cet article couvre la fonction PHP hrtime() : ce qu'elle fait, en quoi ses deux modes de retour diffèrent, pourquoi son horloge monotone en fait l'outil idéal pour le benchmarking, et des exemples concrets que vous pouvez exécuter.

Introduction à la fonction hrtime()

hrtime() est une fonction intégrée disponible en PHP 7.3 et versions ultérieures. Elle lit le minuteur haute résolution du système et retourne l'heure courante avec une précision à la nanoseconde. Son objectif principal est le benchmarking — mesurer la durée d'exécution d'un bout de code.

Le mot clé est monotone. Une horloge monotone avance toujours à un rythme constant ; elle n'est pas affectée par les changements d'heure système, les ajustements NTP, ou les transitions de l'heure d'été. C'est exactement ce qu'il faut pour mesurer un temps écoulé. Les fonctions d'horloge murale comme microtime() et time() peuvent sauter en arrière ou en avant si l'horloge système est corrigée en cours de mesure, ce qui corromprait un benchmark.

Notez que hrtime() mesure le temps depuis une époque arbitraire (souvent le démarrage du système). La valeur absolue n'a pas de sens en elle-même — elle n'est utile qu'en tant que différence entre deux lectures.

Syntaxe et valeurs de retour

hrtime(bool $as_number = false): array|int|false
  • $as_number — lorsque false (par défaut), retourne un tableau à deux éléments [seconds, nanoseconds]. Lorsque true, retourne un entier unique : le temps total en nanosecondes.
  • Retourne false si le minuteur haute résolution est indisponible.

La forme entière unique (hrtime(true)) est la plus pratique pour le benchmarking, car vous pouvez soustraire deux lectures directement.

Benchmarking avec hrtime(true)

php— editable, runs on the server

La logique est la suivante : capturer $start, exécuter le code, capturer $end, puis prendre la différence. Étant donné que les lectures sont en nanosecondes, divisez par 1e6 (1 000 000) pour obtenir des millisecondes, ou par 1e9 pour obtenir des secondes. Le résultat pour une mise en veille de 1,5 ms sera d'environ 1.5 ms (la valeur exacte varie légèrement selon la charge système).

Lecture du tableau [seconds, nanoseconds]

Appelée sans argument, hrtime() retourne un tableau que vous pouvez déstructurer :

<?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";
?>

Cette forme est rarement nécessaire en pratique — hrtime(true) vous donne déjà la valeur combinée — mais elle montre ce que le minuteur rapporte réellement.

Quand utiliser hrtime() plutôt que microtime()

  • Utilisez hrtime() pour les micro-benchmarks et toute mesure où la précision est importante. Elle est monotone et offre une résolution à la nanoseconde.
  • Utilisez microtime() lorsque vous avez besoin d'un horodatage d'horloge murale (secondes depuis l'époque Unix) plutôt qu'une durée écoulée.

Points d'attention

  • Précision des calculs en virgule flottante. Diviser des nanosecondes par 1e6 produit un flottant, ce qui convient pour l'affichage mais peut perdre en précision sur de très longs intervalles. Conservez la différence en nanosecondes entières pendant la mesure, et ne convertissez qu'à la fin.
  • Scripts très longs. Sur une version 32 bits, l'entier en nanosecondes peut déborder. Pour des différences arbitrairement grandes, utilisez les extensions bcmath ou gmp pour une arithmétique précise.
  • Ne traitez pas la valeur comme une date. Ce n'est pas un horodatage Unix ; vous ne pouvez pas la formater avec date().

Conclusion

hrtime() est l'outil approprié pour mesurer la durée d'exécution d'un code PHP. Utilisez hrtime(true) pour obtenir une lecture en nanosecondes avant et après le code, soustrayez, et convertissez dans l'unité souhaitée. Son horloge monotone rend le résultat fiable même lorsque l'horloge système change — ce que microtime() ne peut pas garantir.

Pratique

Pratique
Quel est l'objectif de la fonction hrtime() en PHP ?
Quel est l'objectif de la fonction hrtime() en PHP ?
Was this page helpful?