Signatur
Beschreibung
hrtime() liefert die aktuelle Zeit eines monotonen Hochauflösungs-Timers, der nicht durch manuelle Systemuhr-Änderungen oder NTP-Korrekturen beeinflusst wird. Der Timer startet typischerweise beim Systemstart und ist daher nicht als absolute Uhrzeit geeignet, sondern ausschließlich zur Messung von Zeitdifferenzen (Laufzeitmessungen, Benchmarks).
Wird $as_number auf false (Standard) gesetzt, gibt die Funktion ein zweidimensionales Array zurück: Index 0 enthält die Sekunden, Index 1 die Nanosekunden seit einem festen, aber nicht definierten Zeitpunkt. Wird $as_number auf true gesetzt, gibt die Funktion die Zeit in Nanosekunden als einzelne Ganzzahl (64-Bit Integer auf 64-Bit-Systemen) oder als float zurück.
Gegenüber microtime() bietet hrtime() eine höhere Präzision (Nanosekunden statt Mikrosekunden) und ist durch die Verwendung eines monotonen Timers vor Rückwärtssprüngen der Systemuhr geschützt. Dies macht die Funktion besonders geeignet für Benchmarks, Performance-Messungen und Profiling-Aufgaben im Produktivbetrieb.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $as_number | bool | false | Gibt an, in welchem Format die Zeit zurückgegeben wird. Bei false (Standard) wird ein Array mit Sekunden und Nanosekunden zurückgegeben; bei true wird die Zeit als einzelner Nanosekunden-Wert (Integer oder Float) geliefert. |
Rückgabewert
$as_number false ist: ein Array mit zwei Elementen — [0] Sekunden (int), [1] Nanosekunden (int). Wenn $as_number true ist: die Zeit in Nanosekunden als int (auf 64-Bit-Systemen) oder float (auf 32-Bit-Systemen). Gibt false zurück, wenn ein Fehler auftritt.Beispiele
Einfache Laufzeitmessung mit Array-Rückgabe
<?php
$start = hrtime();
// Zu messender Code
$sum = 0;
for ($i = 0; $i < 1_000_000; $i++) {
$sum += $i;
}
$end = hrtime();
$diffSekunden = $end[0] - $start[0];
$diffNanosekunden = $end[1] - $start[1];
// Gesamtdifferenz in Millisekunden umrechnen
$dauer_ms = ($diffSekunden * 1_000) + ($diffNanosekunden / 1_000_000);
echo sprintf("Dauer: %.4f ms\n", $dauer_ms);
Präzise Zeitmessung mit as_number = true
<?php
$start = hrtime(true); // Nanosekunden als Integer
// Zu messender Code
usleep(5000); // 5 Millisekunden schlafen
$end = hrtime(true);
$dauer_ns = $end - $start;
$dauer_ms = $dauer_ns / 1_000_000;
echo sprintf("Gemessene Dauer: %.3f ms\n", $dauer_ms);
echo "In Nanosekunden: {$dauer_ns} ns\n";
Vergleich mehrerer Implementierungen
<?php
function benchmark(callable $fn, int $iterationen = 10_000): float {
$start = hrtime(true);
for ($i = 0; $i < $iterationen; $i++) {
$fn();
}
return (hrtime(true) - $start) / 1_000_000; // Rückgabe in ms
}
$dauerImplode = benchmark(fn() => implode(',', range(1, 100)));
$dauerJoin = benchmark(fn() => join(',', range(1, 100)));
echo sprintf("implode: %.3f ms\n", $dauerImplode);
echo sprintf("join: %.3f ms\n", $dauerJoin);
// Wichtig · Fallstricke
32-Bit-Systeme: Auf 32-Bit-Plattformen kann der Nanosekunden-Wert bei as_number = true als float zurückgegeben werden, da PHP-Integer dort nur 32 Bit breit sind. Dies kann zu Präzisionsverlusten führen. Für genaue Messungen auf 32-Bit-Systemen empfiehlt sich die Array-Variante (as_number = false).
Kein Zusammenhang mit der aktuellen Uhrzeit: Da der monotone Timer bei Systemstart beginnt, liefert hrtime() keine Angabe über die aktuelle Tageszeit. Nur die Differenz zwischen zwei Messwerten ist aussagekräftig.
Abgrenzung zu microtime(): microtime() basiert auf der Systemuhr und kann durch NTP oder manuelles Stellen der Uhr rückwärts springen, was Zeitmessungen verfälscht. hrtime() ist davon nicht betroffen und daher für Benchmarks vorzuziehen.