PHP Maniac

Das PHP Blog für PHP-Profis und alle die es werden wollen

Laufzeit eines PHP Skripts messen

2 Mai, 2009 (17:38) | Code-Schnipsel, Grundlagen, PHP 5 | Von: PHP Maniac

Heute mal ein Klassiker, den vielleicht schon viele kennen. Allerdings ist die Laufzeitmessung von PHP Skripten eine interessante Sache, auch wenn sie sehr leicht zu implementieren ist. Gerade bei stark frequentierten Seiten oder aufwändigen Berechnungen (Stichwort Parsing oder Crawlen) hilft die Laufzeitmessung mögliche Fehler zu erkennen oder das Skript hinsichtlich der Geschwindigkeit zu verbessern. Wenn so ein Skript dann mehrere hundert Seiten Crawlt, können auch kleine Verbesserungen zu enormen Geschwindigkeitsverbesserungen führen.

So wirds gemacht

Die Skriptlaufzeit wird am einfachsten über die Differenz zwischen Start- und Endzeit des begroffenen Skripts berechnet. Hierzu muss die aktuelle Zeit zu Beginn des Skripts möglichst genau bestimmt und gespeichert werden. Nach Ablauf des Programms wird die Endzeit ebenfalls gespeichert und durch Subtraktion die Differenz gebildet. Diese repräsentiert dann die Laufzeit des Skripts. Lange Rede kurzer Sinn:

$start = time();
//Aufwändige Berechnungen
$end = time();
$laufzeit = $end-$start;
 
echo "Laufzeit: ".$laufzeit." Sekunden!";

Das obige Beispiel misst die Laufzeit in Sekunden. Für die meisten Skripte ist dies jedoch viel zu ungenau, da diese (hoffentlich) deutlich unter einer Sekunde abgearbeitet werden. Daher empfiehlt es sich die Laufzeit in Millisekunden zu messen:

$start = microtime(true);
//Aufwändige Berechnung
$end = microtime(true);
 
$laufzeit = $end - $start;
echo "Laufzeit: ".$laufzeit." Sekunden!";

Der Befehl microtime liefert uns die aktuelle Zeit in Mikrosekunden zurück. Über den boolschen Parameter wird diese als float formatiert, was für die Subtraktion benötigt wird. Zu beachten ist jedoch, dass dieser Parameter erst seit PHP 5 zur Verfügung steht.

Hinweise zur Laufzeitmessung

Wird die Laufzeitmessung in größeren Projekten, die aus einer vielzahl von Dateien bestehen, verwendet, so muss natürlich darauf geachtet werden, dass die Startzeit immer ganz zu Anfang des Programms und die Endzeit samt Auswertung ganz zum Schluss genommen werden. In der Praxis können das Header und Footer Dateien sein, generell ist bei solchen Projekten jedoch zu empfehlen alle Funktionen über eine index.php laufen zu lassen, die alle benötigten Dateien includet. Somit kann die Laufzeitmessung auch ausschließlich in dieser erfolgen.

Be Sociable, Share!

Kommentare

Kommentar von Pascal
Datum 28. Mai 2009 um 12:58 Uhr

Hey,
echo „Laufzeit: „.$laufzeit.“ Millisekunden!“;
bei dem Rechnen mit Millisekunden stimmt nicht so ganz, es müsste
echo „Laufzeit: „.$laufzeit.“ Sekunden!“;
heißen 😉

Zumindest zeigt das empirisches Testen 😛

Gruß

Kommentar von PHP Maniac
Datum 30. Mai 2009 um 15:27 Uhr

Tatsache! Vielen Dank für den Hinweis, habs oben mal geändert 🙂

Kommentar von Miko
Datum 8. Oktober 2012 um 15:09 Uhr

Hallo,
man kann Variablen auch direkt mit den Strings verbinden, lediglich wenn du die DOPPELTEN Anführungsstriche benutzt, sprich:
echo „Laufzeit: $laufzeit Sekunden“;

Schönen Tag

Kommentar von Nejat Philip Eryigit
Datum 12. September 2013 um 16:01 Uhr

Habe gerade in einem Project die Prozessinformationen benötigt und dazu folgende Hilfsfunktionen geschrieben, bevor ich auf diese Seite stieß. Vlt. ist es auch für andere nützlich:

/**
* Return process time of this job
*
* @param boolean $hr Return human readable formats; else in second (Default)
*
* @return –
*/
public function getProcessInfo($infoText, $hrTime = true)
{
$pT = time() – $this->_startTime;

if ($hrTime) {
$pT = ‚| time elapsed: ‚ . $this->timeSecondsinHhMmSs($pT);
} else {
$pT = ‚| time elapsed: ‚ . ($this->_startTime – time());
}

if ($this->traceSteps) {
echo $infoText
. $pT
. EOL_LOG
;
}
}

/**
* Converts seconds into human readable time day
*
* @example output:
* ‚5d 22:07:02‘ (default)
*
* @param integer $timeInput
* Time in seconds
* @param String $f
* Separator Default: ‚:‘
*
* @return string Time
*/
public function timeSecondsinHhMmSs ($timeInput, $separator = ‚:‘, $dayUnit = ‚d‘)
{
$return = ’00:00:00′;
if ($timeInput) {
$days = floor($timeInput / (60 * 60 * 24));
$leading = “;
if ($days) {
$leading = $days . $dayUnit . ‚ ‚; // for days
}
$return = $leading . sprintf(
„%02d%s%02d%s%02d“,
floor($timeInput / 3600),
$separator,
($timeInput / 60) % 60,
$separator,
$timeInput % 60
);
}
return $return;
}

Bsp:
$this->_backend->getProcessInfo(‚ ‚| memory-usage: ‚ . (memory_get_usage(true)/1024));

Schreibe einen Kommentar