Signatur
Beschreibung
HRTime\StopWatch ist eine objektorientierte Stoppuhr aus der PECL-Erweiterung hrtime, die hochauflösende Zeitmessungen (Nanosekunden-Genauigkeit) ermöglicht. Sie eignet sich hervorragend für Mikro-Benchmarks, Profiling-Aufgaben und überall dort, wo microtime() zu ungenau ist oder durch Systemuhr-Änderungen verfälscht werden kann.
Die Klasse arbeitet intern mit einem monotonen Systemtakt, der unabhängig von der Wanduhr ist. Damit sind Messungen auch dann zuverlässig, wenn die Systemzeit während der Messung angepasst wird (z. B. durch NTP). Mit start() und stop() können beliebig viele Messabschnitte akkumuliert werden.
Die gemessene Zeit kann in verschiedenen Einheiten abgefragt werden: Sekunden, Millisekunden, Mikrosekunden und Nanosekunden. Über isRunning() lässt sich jederzeit prüfen, ob die Uhr aktiv misst. Mit reset() wird der akkumulierte Wert auf null gesetzt.
Hinweis: Die hrtime-PECL-Erweiterung muss installiert sein. Ab PHP 7.3 steht die Funktion hrtime() nativ zur Verfügung, die für viele Anwendungsfälle ausreicht; die HRTime\StopWatch-Klasse bietet jedoch komfortablere Pause/Fortsetzen-Semantik.
Beispiele
Einfache Zeitmessung einer Schleife
<?php
$sw = new HRTime\StopWatch();
$sw->start();
for ($i = 0; $i < 1_000_000; $i++) {
// simulierte Arbeit
}
$sw->stop();
echo 'Vergangene Zeit (ms): ' . $sw->getElapsedMilliseconds() . PHP_EOL;
echo 'Vergangene Zeit (ns): ' . $sw->getElapsedNanoseconds() . PHP_EOL;
Mehrere Messabschnitte akkumulieren
<?php
$sw = new HRTime\StopWatch();
// Erster Abschnitt
$sw->start();
usleep(5000); // 5 ms warten
$sw->stop();
echo 'Nach Abschnitt 1 (ms): ' . $sw->getElapsedMilliseconds() . PHP_EOL;
// Zweiter Abschnitt wird akkumuliert
$sw->start();
usleep(3000); // 3 ms warten
$sw->stop();
echo 'Gesamt nach Abschnitt 2 (ms): ' . $sw->getElapsedMilliseconds() . PHP_EOL;
// Zurücksetzen
$sw->reset();
echo 'Nach Reset (ms): ' . $sw->getElapsedMilliseconds() . PHP_EOL;
Laufzustand der Stoppuhr prüfen
<?php
$sw = new HRTime\StopWatch();
var_dump($sw->isRunning()); // false
$sw->start();
var_dump($sw->isRunning()); // true
$sw->stop();
var_dump($sw->isRunning()); // false
// Wichtig · Fallstricke
Die hrtime-Erweiterung ist eine PECL-Erweiterung und standardmäßig nicht in PHP enthalten. Sie muss über pecl install hrtime installiert werden. Ab PHP 7.3 kann hrtime(true) als leichtgewichtige Alternative für einfache Messungen verwendet werden.
Da HRTime\StopWatch auf einem monotonen Takt basiert, sind die Messwerte nicht mit der Echtzeit (Wanduhr) vergleichbar – sie eignen sich ausschließlich für Differenzmessungen. Ein Aufruf von stop() ohne vorheriges start() ist ungefährlich und hat keine Auswirkung. Ebenso wird ein doppeltes start() ohne zwischenzeitliches stop() ignoriert.