W3docs

hrtime()

In diesem Artikel befassen wir uns mit der PHP-Funktion hrtime(): Überblick, Funktionsweise und Beispiele zur Verwendung.

Dieser Artikel behandelt die PHP-Funktion hrtime(): was sie tut, wie sich ihre zwei Rückgabemodi unterscheiden, warum ihre monotone Uhr das richtige Werkzeug für Benchmarking ist, und bearbeitete Beispiele, die Sie ausführen können.

Einführung in die Funktion hrtime()

hrtime() ist eine eingebaute Funktion, die ab PHP 7.3 verfügbar ist. Sie liest den hochauflösenden Timer des Systems und gibt die aktuelle Zeit mit Nanosekunden-Genauigkeit zurück. Ihr Hauptzweck ist Benchmarking — das Messen, wie lange ein Code-Abschnitt zur Ausführung benötigt.

Das entscheidende Stichwort ist monoton. Eine monotone Uhr bewegt sich ausschließlich vorwärts und mit gleichmäßiger Geschwindigkeit; sie wird nicht durch Systemuhränderungen, NTP-Anpassungen oder Sommerzeit-Umstellungen beeinflusst. Genau das brauchen Sie für die Messung von Laufzeiten. Wanduhren-Funktionen wie microtime() und time() können rückwärts oder vorwärts springen, wenn die Systemuhr mitten in einer Messung korrigiert wird, was ein Benchmark-Ergebnis verfälschen würde.

Beachten Sie, dass hrtime() die Zeit seit einer beliebigen Epoche misst (oft dem Systemstart). Der absolute Wert ist für sich genommen bedeutungslos — er ist nur als Differenz zwischen zwei Messungen nützlich.

Syntax und Rückgabewerte

hrtime(bool $as_number = false): array|int|false
  • $as_number — wenn false (Standard), wird ein zweiteiliges Array [seconds, nanoseconds] zurückgegeben. Wenn true, wird eine einzelne Ganzzahl zurückgegeben: die Gesamtzeit in Nanosekunden.
  • Gibt false zurück, wenn der hochauflösende Timer nicht verfügbar ist.

Die Einzelganzzahl-Form (hrtime(true)) ist für Benchmarking am bequemsten, weil Sie zwei Messungen direkt voneinander subtrahieren können.

Benchmarking mit hrtime(true)

php— editable, runs on the server

Die Logik lautet: $start erfassen, den Code ausführen, $end erfassen und dann die Differenz berechnen. Da die Messungen in Nanosekunden vorliegen, dividieren Sie durch 1e6 (1.000.000), um Millisekunden zu erhalten, oder durch 1e9 für Sekunden. Das Ergebnis für einen 1,5-ms-Schlaf wird ungefähr 1.5 ms betragen (der genaue Wert variiert leicht aufgrund des System-Overheads).

Das Array [seconds, nanoseconds] lesen

Ohne Argument aufgerufen gibt hrtime() ein Array zurück, das Sie destrukturieren können:

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

Diese Form wird in der Praxis selten benötigt — hrtime(true) liefert den kombinierten Wert bereits direkt — zeigt aber, was der Timer tatsächlich meldet.

Wann hrtime() vs microtime() verwenden?

  • Verwenden Sie hrtime() für Mikro-Benchmarks und jede Messung, bei der Genauigkeit wichtig ist. Die Funktion ist monoton und bietet Nanosekunden-Auflösung.
  • Verwenden Sie microtime(), wenn Sie einen Wanduhr-Zeitstempel (Sekunden seit der Unix-Epoche) benötigen und keine vergangene Zeitspanne messen möchten.

Fallstricke

  • Genauigkeit von Float-Arithmetik. Das Dividieren von Nanosekunden durch 1e6 erzeugt eine Gleitkommazahl, die für die Anzeige geeignet ist, aber bei sehr langen Zeitintervallen Genauigkeit verlieren kann. Halten Sie die Differenz während der Messung als ganzzahlige Nanosekunden und konvertieren Sie erst am Ende.
  • Sehr lang laufende Skripte. Bei einem 32-Bit-Build kann die Nanosekunden-Ganzzahl überlaufen. Für beliebig große Differenzen verwenden Sie die Erweiterungen bcmath oder gmp für präzise Arithmetik.
  • Den Wert nicht als Datum behandeln. Es ist kein Unix-Zeitstempel; Sie können ihn nicht mit date() formatieren.

Fazit

hrtime() ist das richtige Werkzeug, um zu messen, wie lange PHP-Code zur Ausführung benötigt. Verwenden Sie hrtime(true), um eine Nanosekunden-Messung vor und nach dem Code zu erfassen, subtrahieren Sie und konvertieren Sie in die gewünschte Einheit. Ihre monotone Uhr macht das Ergebnis zuverlässig, auch wenn sich die Systemuhr ändert — etwas, das microtime() nicht garantieren kann.

Übungen

Übung
Was ist der Zweck der Funktion hrtime() in PHP?
Was ist der Zweck der Funktion hrtime() in PHP?
Was this page helpful?