PHP: Machen die Ausgabepuffer-Funktionen ob_start()/ob_get_clean() das Skript langsam?

Technik

In den letzten Monaten habe ich die Ausgabepuffer-Funktionen ob_start() und ob_get_clean() immer häufiger verwendet. Nicht, um das die gesamte Ausgabe zu unterdrücken, sondern um einzelne Fragmente zu verschieben. Ist das schlau?

Konkret habe ich vor allem Code-Teile an eine andere Position verschieben wollen. Um z.B. die Ladezeit der Seite zu beschleunigen, wurde jQuery ans Ende des HTML Dokumentes verlagert. Alle script-Elemente, die jQuery benötigen, können daher erst nach dem jQuery-Import ausgeführt werden. Diese Element werden daher mit ob_start() aufgefangen und mittels ob_get_clean() in einer Variable gespeichert. Jetzt kann es schon passieren, dass z.B. 10-20 solcher Elemente zusammenkommen und der Puffer dementsprechend oft aktiviert und ausgelesen wird.

Doch schadet das der Performance? Da hilft nur ein Test. Ich habe einfach eine feste Tabelle 10.000 mal in einer for-Schleife ausgeben lassen. Einmal direkt und einmal wurde jede Tabelle von ob_start() aufgefangen und mit ob_get_clean() zwischengespeichert. Davon habe ich 5 Testläufe durchgeführt folgendermaßen gemessen:

echo microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'];

Das Ergebnis steht in dieser Tabelle:

Durchlauf Sek. ohne Buffer Sek. mit Buffer
1 0.033214092254639 0.047609090805054
2 0.030350923538208 0.045974016189575
3 0.028276920318604 0.044750928878784
4 0.02832293510437 0.044335126876831
5 0.03282618522644 0.040101051330566
Mean 0.030598211 0.044554043
Std. Deviation 0.002368181 0.002795776

Das Ergebnis ist doch ziemlich eindeutig. Auch wenn die Variante ohne Puffer um ein Drittel schneller ist, handelt es sich sogar bei 10.000 Aufrufen nur um ca. 0.015 Sekunden, die man gewinnt.

Fazit

Ja, offenbar rüttelt ob_start()/ob_get_clean() etwas an der Geschwindigkeit, aber insgesamt ist der Zeitverlust zu vernachlässigen. Vielmehr scheint es so, als ob es auf die Anzahl der Aufrufe gar nicht ankommt. Einmal oder 100.000 Mal führt fast zum gleichen - aber minimalen - Performance-Verlust.

Puffert man die ganze Ausgabe, hat man ggf. den Nachteil, dass der Arbeitsspeicher übermäßig belastet wird. Aber auch das sollte in der Regel kein allzu großes Problem sein. Man sollte für das Debugging eine gewisse Form bewahren. Aber abseits dieser Kleinigkeiten fällt mir kein Grund ein, die Ausgabepuffer-Funktionen nicht zu benutzen. Im Gegenteil, ich halte sie sogar für good practice.

Permalink: https://to.ptmr.io/1eHFsZ1