Wie lange braucht ein bestimmter Codeabschnitt zur Ausführung? PHP liefert mit der Funktion microtime() eine einfache Antwort auf diese Frage. Sie gibt den aktuellen Unix Timestamp mit Mikrosekunden-Präzision zurück und eignet sich damit ideal für schnelle Laufzeitmessungen direkt im Skript.

Zunächst wird erklärt, wie die Funktion aufgebaut ist und welche Rückgabeformate sie unterstützt.
Was macht microtime()?
Die Funktion microtime() liefert die aktuelle Zeit als Unix Timestamp, also die Anzahl der Sekunden seit der Unix Epoch (1. Januar 1970, 00:00:00 UTC). Im Gegensatz zu time() enthält der Rückgabewert zusätzlich den Mikrosekundenanteil, was deutlich präzisere Messungen ermöglicht.
<?php
echo microtime(); /* z.B. "0.12345600 1700000000" */
echo microtime(true); /* z.B. 1700000000.1235 */
Die Funktion akzeptiert einen optionalen booleschen Parameter, der das Format des Rückgabewerts bestimmt.
microtime(true) vs. microtime(false)
Je nach Parameterwert gibt microtime() das Ergebnis in zwei unterschiedlichen Formaten zurück.
Float-Rückgabe mit true
Wird microtime(true) aufgerufen, liefert die Funktion einen Float-Wert. Dieser enthält den kompletten Timestamp inklusive Mikrosekunden als Dezimalstellen. Dieses Format eignet sich hervorragend für Berechnungen, da sich zwei Float-Werte einfach voneinander subtrahieren lassen.
String-Rückgabe ohne Parameter
Ohne Parameter oder mit false gibt microtime() einen String im Format "Mikrosekunden Sekunden" zurück, etwa "0.12345600 1700000000". Der Mikrosekundenanteil steht dabei vor dem Sekundenanteil. Für Zeitmessungen ist dieses Format weniger praktisch, da zuerst eine Umwandlung nötig wäre.
Skript-Ausführungszeit messen
Das Grundprinzip ist einfach: Vor und nach dem zu messenden Code wird jeweils microtime(true) aufgerufen. Die Differenz ergibt die Laufzeit in Sekunden.
flowchart TD
A["microtime(true)"] --> B[Startzeit als Float]
C[Code ausfuehren] --> D["microtime(true)"]
D --> E[Endzeit als Float]
B --> F["Dauer = Ende - Start"]
E --> F
F --> G[Ergebnis in Sekunden]
Das folgende Beispiel misst die Ausführungszeit einer einfachen Schleife:
<?php
$start = microtime(true);
/* Hier steht der zu messende Code */
for ($i = 0; $i < 100000; $i++) {
$ergebnis = $i * $i;
}
$ende = microtime(true);
$dauer = $ende - $start;
echo 'Ausfuehrungszeit: ' . round($dauer, 4) . ' Sekunden';
Besonders nützlich wird diese Technik beim Vergleich verschiedener Lösungsansätze. Im folgenden Beispiel wird String-Konkatenation gegen implode() getestet:
<?php
$start1 = microtime(true);
$text = '';
for ($i = 0; $i < 10000; $i++) {
$text .= 'Zeile ' . $i;
}
$dauer1 = microtime(true) - $start1;
$start2 = microtime(true);
$teile = [];
for ($i = 0; $i < 10000; $i++) {
$teile[] = 'Zeile ' . $i;
}
$text = implode('', $teile);
$dauer2 = microtime(true) - $start2;
echo 'Konkatenation: ' . round($dauer1, 4) . ' s';
echo 'implode: ' . round($dauer2, 4) . ' s';
hrtime() als präzisere Alternative
Seit PHP 7.3 steht hrtime() zur Verfügung. Diese Funktion nutzt eine monotone Uhr, die unabhängig von Systemzeitänderungen (zum Beispiel NTP-Synchronisation) arbeitet. Das macht sie zuverlässiger als microtime() für Zeitmessungen.
<?php
$start = hrtime(true); /* Nanosekunden als Integer */
for ($i = 0; $i < 100000; $i++) {
$ergebnis = $i * $i;
}
$ende = hrtime(true);
$dauer = ($ende - $start) / 1e9; /* Umrechnung in Sekunden */
echo 'Ausfuehrungszeit: ' . round($dauer, 6) . ' Sekunden';
Der Aufruf hrtime(true) gibt Nanosekunden als Integer zurück. Dividiert durch 1e9 ergibt sich die Dauer in Sekunden. Im Gegensatz zu microtime() wird die Messung nicht verfälscht, wenn sich die Systemuhr während der Messung ändert.
Benchmark-Funktion mit Mehrfach-Läufen
Einzelne Messungen sind wenig aussagekräftig, da Faktoren wie Serverlast, Caching oder Garbage Collection die Ergebnisse beeinflussen. Eine Benchmark-Funktion mit mehreren Durchläufen liefert deutlich stabilere Werte.
<?php
function benchmark(callable $funktion, int $durchlaeufe = 1000): array
{
$zeiten = [];
for ($i = 0; $i < $durchlaeufe; $i++) {
$start = hrtime(true);
$funktion();
$zeiten[] = hrtime(true) - $start;
}
sort($zeiten);
$anzahl = count($zeiten);
return [
'min' => round($zeiten[0] / 1e6, 4),
'max' => round($zeiten[$anzahl - 1] / 1e6, 4),
'durchschnitt' => round(array_sum($zeiten) / $anzahl / 1e6, 4),
'median' => round($zeiten[(int)($anzahl / 2)] / 1e6, 4),
];
}
$ergebnis = benchmark(function () {
$text = '';
for ($i = 0; $i < 1000; $i++) {
$text .= 'Zeile ' . $i;
}
}, 500);
echo 'Min: ' . $ergebnis['min'] . ' ms';
echo 'Max: ' . $ergebnis['max'] . ' ms';
echo 'Durchschnitt: ' . $ergebnis['durchschnitt'] . ' ms';
echo 'Median: ' . $ergebnis['median'] . ' ms';
Die Funktion gibt Minimum, Maximum, Durchschnitt und Median in Millisekunden zurück. Der Median ist oft aussagekräftiger als der Durchschnitt, da einzelne Ausreißer ihn weniger beeinflussen.
Speicherverbrauch messen
Neben der Laufzeit ist der Speicherverbrauch ein wichtiger Performance-Indikator. Die Funktionen memory_get_usage() und memory_get_peak_usage() zeigen den aktuellen und den maximalen Speicherverbrauch eines Skripts.
<?php
$speicherVorher = memory_get_usage();
$daten = range(1, 100000);
$speicherNachher = memory_get_usage();
$verbrauch = $speicherNachher - $speicherVorher;
echo 'Verbrauch: ' . round($verbrauch / 1024, 2) . ' KB';
echo 'Spitzenwert: ' . round(memory_get_peak_usage() / 1024 / 1024, 2) . ' MB';
Der Parameter true bei memory_get_usage(true) gibt den tatsächlich vom Betriebssystem zugewiesenen Speicher zurück, während der Standardaufruf nur den von PHP intern genutzten Speicher misst.
Tipps und Einschränkungen
microtime() und hrtime() messen die sogenannte Wall Clock Time, also die tatsächlich verstrichene Zeit. CPU-Zeit bleibt unberücksichtigt. Für umfangreiches Profiling empfehlen sich spezialisierte Tools wie Xdebug (mit Profiling-Modus) oder Blackfire, die detaillierte Einblicke in Funktionsaufrufe, Speichernutzung und Aufrufhierarchien bieten.
Die tatsächliche Genauigkeit von microtime() hängt vom Betriebssystem ab. hrtime() ist auf allen Plattformen zuverlässig, da es eine monotone Uhr nutzt. Für neue Projekte ab PHP 7.3 ist hrtime() daher die bessere Wahl.
Fazit
microtime(true) ist das einfachste Werkzeug für schnelle Performance-Messungen in PHP. Für präzisere und zuverlässigere Messungen bietet hrtime(true) seit PHP 7.3 eine monotone Uhr mit Nanosekunden-Auflösung. Kombiniert mit memory_get_usage() lässt sich sowohl die Laufzeit als auch der Speicherverbrauch eines Skripts analysieren. Für reproduzierbare Ergebnisse sollte der Code in mehreren Durchläufen gemessen werden. Sobald tiefere Analysen gefragt sind, lohnt sich der Einsatz professioneller Profiling-Tools.