Die Funktion microtime(true) gibt den aktuellen Zeitstempel als Fließkommazahl in Sekunden zurück. Durch zwei Aufrufe (vor und nach einem Codeabschnitt) lässt sich die Laufzeit beliebiger PHP-Abschnitte auf die Mikrosekunde genau messen. Das ist der Standardweg für Performance-Messungen in PHP.
Grundprinzip: Start und Ende messen
Das Prinzip ist einfach: Zeitstempel vor dem Code merken, Zeitstempel danach merken, Differenz bilden.
<?php
$start = microtime(true);
/* Hier steht der Code, der gemessen werden soll */
usleep(50000); // 50 Millisekunden Pause als Beispiel
$ende = microtime(true);
$dauer = $ende - $start;
echo 'Laufzeit: ' . round($dauer, 4) . ' Sekunden';
/* Ausgabe: Laufzeit: 0.0501 Sekunden */
?>
Der Parameter true bei microtime(true) sorgt dafür, dass die Zeit als float zurückgegeben wird. Ohne diesen Parameter liefert die Funktion einen String, der erst umständlich zerlegt werden müsste.
Praxisbeispiel: Schleifengeschwindigkeit vergleichen
Ein häufiger Anwendungsfall ist der Vergleich verschiedener Lösungsansätze, um den schnelleren zu finden:
<?php
$daten = range(1, 10000);
/* Variante 1: for-Schleife */
$start = microtime(true);
$summe = 0;
for ($i = 0; $i < count($daten); $i++) {
$summe += $daten[$i];
}
$zeit1 = microtime(true) - $start;
/* Variante 2: array_sum */
$start = microtime(true);
$summe = array_sum($daten);
$zeit2 = microtime(true) - $start;
echo 'for-Schleife: ' . round($zeit1 * 1000, 2) . ' ms';
echo 'array_sum: ' . round($zeit2 * 1000, 2) . ' ms';
?>
Die Multiplikation mit 1000 rechnet Sekunden in Millisekunden um, was bei kurzen Messungen übersichtlicher ist.
Mehrere Abschnitte messen
Bei komplexeren Scripts lohnt es sich, mehrere Messpunkte zu setzen, um den langsamsten Abschnitt zu identifizieren:
<?php
$zeiten = [];
$zeiten['start'] = microtime(true);
/* Abschnitt 1: Daten laden */
$daten = file_get_contents('daten.csv');
$zeiten['daten_geladen'] = microtime(true);
/* Abschnitt 2: Daten verarbeiten */
$zeilen = explode("\n", $daten);
$zeiten['verarbeitet'] = microtime(true);
/* Ergebnis ausgeben */
foreach ($zeiten as $name => $zeit) {
if ($name === 'start') continue;
$diff = round(($zeit - $zeiten['start']) * 1000, 2);
echo $name . ': ' . $diff . ' ms<br>';
}
?>
So wird auf einen Blick sichtbar, welcher Teil des Scripts die meiste Zeit beansprucht.
Hilfsfunktion für wiederholte Messungen
Wer regelmäßig Laufzeiten misst, kann sich eine kleine Hilfsfunktion schreiben:
<?php
function timer(string $label = ''): void
{
static $letzte = null;
$jetzt = microtime(true);
if ($letzte !== null) {
$diff = round(($jetzt - $letzte) * 1000, 2);
echo $label . ': ' . $diff . ' ms<br>';
}
$letzte = $jetzt;
}
timer();
/* ... Code-Abschnitt 1 ... */
timer('Daten geladen');
/* ... Code-Abschnitt 2 ... */
timer('Verarbeitung fertig');
?>
Durch die static-Variable merkt sich die Funktion den Zeitpunkt des letzten Aufrufs und gibt automatisch die Differenz aus.
Tipps für zuverlässige Messungen
Einzelne Durchläufe schwanken je nach Serverlast. Für aussagekräftige Ergebnisse empfiehlt es sich, den zu messenden Code mehrfach in einer Schleife auszuführen und den Durchschnitt zu bilden. Außerdem sollte die Messung ohne aktiviertes Xdebug stattfinden, da der Debugger die Laufzeit deutlich verfälscht.