Signatur
Beschreibung
HRTime\PerformanceCounter ist eine Klasse der PECL-Erweiterung hrtime, die Zugriff auf den hochauflösenden Systemzähler bietet. Sie eignet sich hervorragend für präzise Laufzeitmessungen von Code-Abschnitten, Benchmarks und Performance-Profiling direkt in PHP, ohne auf externe Tools angewiesen zu sein.
Die Klasse stellt statische Methoden bereit, um den aktuellen Zählerstand (getFrequency(), getTicks(), getTicksSince()) abzurufen. Dabei arbeitet sie direkt mit den nativen Hochleistungs-Timern des Betriebssystems (z. B. QueryPerformanceCounter unter Windows oder clock_gettime unter Linux/macOS), was eine Genauigkeit im Nanosekunden-Bereich ermöglicht.
Im Gegensatz zu microtime(), das auf der Wall-Clock-Zeit basiert und durch NTP-Anpassungen beeinflusst werden kann, liefert HRTime\PerformanceCounter monotone, nicht manipulierbare Zeitwerte, die sich besonders gut für Mikrobenchmarks eignen.
Die Erweiterung muss separat über PECL installiert werden (pecl install hrtime). Ab PHP 7.3 steht alternativ die eingebaute Funktion hrtime() zur Verfügung, die eine ähnliche Funktionalität ohne externe Erweiterung bietet.
Beispiele
Einfache Laufzeitmessung eines Code-Abschnitts
<?php
// Startzeit in Ticks ermitteln
$start = HRTime\PerformanceCounter::getTicks();
// Zu messender Code
$sum = 0;
for ($i = 0; $i < 1_000_000; $i++) {
$sum += $i;
}
// Verstrichene Ticks berechnen
$elapsed = HRTime\PerformanceCounter::getTicksSince($start);
// Frequenz (Ticks pro Sekunde) abfragen
$frequency = HRTime\PerformanceCounter::getFrequency();
// Umrechnung in Sekunden
$seconds = $elapsed / $frequency;
printf("Vergangene Ticks: %d\n", $elapsed);
printf("Frequenz: %d Hz\n", $frequency);
printf("Laufzeit: %.9f Sekunden\n", $seconds);
Vergleich mehrerer Implementierungen per Benchmark
<?php
function benchmark(string $label, callable $fn, int $iterations = 100_000): void
{
$start = HRTime\PerformanceCounter::getTicks();
for ($i = 0; $i < $iterations; $i++) {
$fn();
}
$elapsed = HRTime\PerformanceCounter::getTicksSince($start);
$freq = HRTime\PerformanceCounter::getFrequency();
$ms = ($elapsed / $freq) * 1000;
printf("%-30s %.4f ms (%d Iterationen)\n", $label, $ms, $iterations);
}
$data = range(1, 100);
benchmark('array_sum()', function () use ($data) {
return array_sum($data);
});
benchmark('Manuelle Schleife', function () use ($data) {
$s = 0;
foreach ($data as $v) {
$s += $v;
}
return $s;
});
// Wichtig · Fallstricke
Installation: Die HRTime-Erweiterung ist nicht standardmäßig in PHP enthalten und muss via pecl install hrtime installiert und in der php.ini mit extension=hrtime aktiviert werden.
PHP 7.3+: Seit PHP 7.3 steht die eingebaute Funktion hrtime() zur Verfügung, die eine ähnliche Funktionalität bietet, ohne eine externe PECL-Erweiterung zu benötigen. Für neue Projekte ist hrtime() zu bevorzugen.
Plattformabhängigkeit: Die tatsächliche Auflösung hängt vom Betriebssystem und der Hardware ab. Unter Windows ist die Frequenz typischerweise 10 MHz, unter Linux/macOS 1 GHz (Nanosekunden-Auflösung).
Keine Wall-Clock: Die zurückgegebenen Werte sind monoton und eignen sich nicht zur Bestimmung der aktuellen Uhrzeit — nur für Zeitdifferenzen.