de

designoir

Stop Watch

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.

Stopwatch.php

<?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();
    }
}

Example #1: sleep.php

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';

Run sleep.php

Example #2: strpos-vs-preg_match.php

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

Run strpos-vs-preg_match.php

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.

Comments

HTML will not be interpreted.

Last changed on June 4, 2007 Dão G., 2005–2010
aggressiv akt andromeda bar beine blue efeu frontal fugaetu industriell komet land noir rost rot sonnenblume splash split winter wolke zeit