Die Stoppuhr-Klasse ist eine einfache und elegante Möglichkeit, Zeiten zur Laufzeit von PHP zu messen. Sie besteht ausschließlich aus dem Konstruktor, der die Startzeit speichert, und der stop()-Methode, die die seit der Instanziierung vergangene Zeit in Sekunden zurückgibt.
<?php
class Stopwatch {
private $tStart;
public $t = 0;
public function __construct() {
$this->go();
}
public function go() {
$this->tStart = microtime(true);
}
public function stop() {
return $this->t += (microtime(true) - $this->tStart);
}
public function reset() {
$this->t = 0;
$this->go();
}
}
Hier eine exemplarische Anwendung:
<?php
$a = new Stopwatch;
$b = new Stopwatch;
sleep(1);
$b->stop();
$c = new Stopwatch;
usleep(300000);
$c->stop();
$b->go();
usleep(600000);
$b->stop();
echo $a->stop(), ' = ', $b->t, ' + ', $c->t, ' + overhead';
Das nächste Beispiel zeigt, wie sich damit die Geschwindigkeit von Codeteilen vergleichen lässt, was hilfreich sein kann, um für ein Problem den schnellsten Algorithmus oder für einen Algorithmus die schnellste Implementierung zu finden.
<?php
define ('HAYSTACK', '_______!___');
define ('NEEDLE', '!');
define ('LOOPS', 2000);
echo str_pad ('strpos: ', 31);
$i = LOOPS;
$timer = new Stopwatch;
while ($i) {
strpos (HAYSTACK, NEEDLE);
$i--;
}
echo $timer->stop(), "\n";
echo str_pad ('strpos as boolean: ', 31);
$i = LOOPS;
$timer->reset();
while ($i)
$i -= strpos (HAYSTACK, NEEDLE) !== false;
echo $timer->stop(), "\n";
echo str_pad ('preg_match: ', 31);
$i = LOOPS;
$timer->reset();
while ($i)
$i -= preg_match ('/'.NEEDLE.'/', HAYSTACK);
echo $timer->stop(), "\n";
echo str_pad ('preg_match, prepared pattern: ', 31);
$needle = '/'.NEEDLE.'/';
$i = LOOPS;
$timer->reset();
while ($i)
$i -= preg_match ($needle, HAYSTACK);
echo $timer->stop(), "\n";
echo str_pad ('ereg: ', 31);
$i = LOOPS;
$timer->reset();
while ($i)
$i -= ereg (NEEDLE, HAYSTACK);
echo $timer->stop(), "\n";
Denkbar ist es ebenso, die Stoppuhr in einer Datenbank-Klasse zu verwenden und die Zeiten jeder Abfrage in eine Logdatei zu schreiben, um zu erkennen, wo die Seite möglicherweise ausgebremst wird.
Selbstverständlich kann man auf diese Weise auch die Ausführzeit der gesamten Seite messen, indem man die Klasse am Skriptanfang instanziiert und am Ende stop() aufruft.