Ausgabe per PHP oder HTML

Heute möchte ich mal wieder das beliebte Thema PHP-Ausgaben behandeln. Genauer gesagt: den Performance-Unterschied zwischen PHP- und HTML-Ausgaben. Man kann ja die gesamte Logik in PHP schreiben und außerhalb eines PHP-Blockes dann einfach per HTML die Ausgabe schreiben, doch ist das schneller als direkt von PHP die Ausgabe ausführen zu lassen?

Zur Verdeutlichung: Es geht um diese zu vergleichenden Snippets:

// PHP-Ausgabe
<?php
for($i=0;$i<1000;$i++) {
  echo "Dies ist der ".$i.". Durchlauf: ";
  if($i & 1) echo "ungerade";
  else echo "gerade";
  echo "<br />";
}
?>
 
// HTML-Ausgabe
<?php
for($i=0;$i<1000;$i++) {
?>
Dies ist der <?php echo $i; ?>. Durchlauf:
<?php
  if($i & 1) { ?> ungerade
  <?php
  } else {
  ?>
  gerade
  <?php
  }
  ?>
  <br />
<?php
}
?>

Was vermuten sie, welche Variante schneller ist? Mein erstes Gefühl ging eindeutig Richtung der zweiten Version, da dort die Ausgabestrings nicht geparst werden müssen. Um so erstaunter war ich, als folgendes Ergebnis herauskam (weil ich es zuerst nicht glauben wollte, habe ich den Test mehrmals durchgeführt).

Datei Gesamtlaufzeit durchschnittliche Laufzeit pro Durchlauf Verhältnis zur schnellsten Variante
ausgabe_phpecho.php 33.618340 s 3.362 ms
ausgabe_htmlecho.php 35.60414 s 3.506 ms 104 % (+ 4%)

Die Ausgabe per HTML ist demzufolge langsamer. Die Suche nach dem Grund dafür brachte mich ins Grübeln, denn wie gesagt muss der PHP-Interpreter in HTML-Strings nicht nach Variablennamen suchen, die er eventuell durch deren Werte ersetzen muss, was eigentlich ein Vorteil für die HTML-Variante darstellen sollte.
Ich bin dann auf die Idee gekommen, dass der Interpreter sich nach jedem PHP-Block „schlafen legt“ und danach wieder anlaufen muss. Allerdings kann ich mir das nicht so ganz vorstellen, da ja eigentlich die gesamte PHP-Datei bearbeitet wird. Trotzdem ist das die einzige Erklärung, die ich finden konnte. Am Output Buffering kann es auch nicht liegen, denn das würde ja nichts daran ändern, dass die PHP-Echo-Strings geparst werden müssten, was Zeit kostete.

Als Auswirkung überlege ich mir gerade, dass man auf größeren Projekten den HTML-Code komplett durch PHP ausgeben lässt. Im Moment betreibe ich es so, dass ich allgemeine Sachen, wie beispielsweise das <html>-Tag und größtenteils auch den gesamten HTML-Kopf (außer den für SEO-Zwecke wichtigen Tags wie <title>) in HTML geschrieben habe und von PHP nur große Teile des Bodys, wo es dann wirklich dynamisch zugeht, ausgeben hab lassen. Was meint ihr: In Zukunft wirklich ALLES als PHP-Echo? Bin gespannt auf eure Meinungen und eventuell weitere Ursachenforschung 😉

Abschließend noch die Quelltexte und die Benchmark-Ergebnisse.

Dieser Beitrag wurde in   PHP veröffentlicht und verschlagwortet mit   , , .
FĂŒgen Sie ein Lesezeichen fĂŒr den   permanenten Link hinzu.

Jan hat 152 BeitrÀge geschrieben

14 Kommentare zu “Ausgabe per PHP oder HTML

  1. Björn sagt:

    Hallo,

    Ja so in etwa hab ich es mir gedacht das so das ergebnis rauskommt.
    Zunkunftsmässig ist der Einsatz vom Template-Engines, anstatt alles mit Echos auszutragen. Ich selbst benutze noch gar kein Smarty. Aber mir sagen alle ich solls benutzen um den Html-Code vom PHP-Code zu trennen.

  2. Artemis sagt:

    Ich denke der Unterschied entsteht nur bei solchen Schleifendurchgängen, da es für den PHP-Interpreter aufwändiger ist einen String wie “ ?> ungerade

  3. Richard Ritschel sagt:

    Ganz klare Unterstützung für Template-Engines meinerseits. Höchstwahrscheinlich leidet die Performance etwas, wenn PHP und HTML getrennt vorliegen. Das ist jedoch leicht hinzunehmen, wenn man den Gewinn an Übersichtlichkeit bedenkt.

  4. Christoph sagt:

    Denke auch, dass Templates der richtige Weg sind. Vor allem, wenn man im Team arbeitet und der Designer kein PHP kann 😉

    Wobei ich dann aber auch wieder sagen muss, dass mir bei Smarty schon zuviel Code drinsteckt. Das sind ja schon keine Templates mehr, sondern ne eigene kleine Mini-Sprache. Das macht den Sinn von TPLs ganz zu nichte.

  5. Hasch sagt:

    Es ist auch durchaus nicht schwer eine eigene Template-Engine zu entwerfen, die dann schnell und effizient das macht, was man braucht und zudem wunderbar PHP von HTML trennt…

  6. Sven sagt:

    Ich denke auch der Weg sollte eher zu einer ordentlichen Template Enginge gehen. Damit wird der ganze Spaß dann deutlich übersichtlicher durch Trennung von PHP & HTML.

  7. Wanja sagt:

    Mich überrascht das Ergebnis nicht wirklich. Wenn Du statt den doppelten Hochkommas einfache verwendest, sollte das Ganze nochmal etwas schneller sein, weil PHP meines Wissens Strings in einfachen Hochkommas nicht nach Variablen durchsucht.

    Allerdings sind diese Unterschiede wohl so gering, dass man gut daran tut sie im TODO der Geschwindigkeits-Optimierung ganz hinten anzustellen, weit hinter den wesentlich gewichtigeren Datenbankoptimierungen etc.

    Ich benutze mittlerweile Smarty für die meissten Projekte, allerdings kaum das Caching von Smarty. Das macht man dann doch besser selbst, weil die Templates auch ohne Caching vorkompiliert werden.

    Was Christof sagt kann ich nicht unterstreichen, ein wenig Logik wie Schleigen und IF-Abfragen muss eine Templateengine schon beherrschen. Wenn mir aber jemand eine performantere Templateenginge für PHP empfehlen kann, bin ich für eine kurze E-Mail sehr dankbar.

  8. GhostGambler sagt:

    PHP selbst ist eine Template-Engine. Das Benutzen von weiterer Software um dies zu erreichen, wofür PHP an sich da ist, ist wie den Bock zum Gärtner machen…

    Eine Abstraktionsebene in der Programmierung höher und man kann das ganze durch objektorientierte Programmierung erreichen~
    Und das ist dann immer noch schneller als Smarty.

  9. Hi,
    und um das Ganze noch zu beschleunigen, sollte man beim echo-Befehl ‚einfache‘ Anführungsstriche benutzen.
    Also statt echo „Hallo $name“; -> echo ‚Hallo ‚.$name;
    Dann muss der Interpreter nicht nach Variablen innerhalb der Anführungszeichen suchen…
    Dennis

  10. David sagt:

    Ich verstehe nicht ganz wieso hier manch daraus schließen möchte das Smarty oder andere zusätzliche Templateengines die bessere Lösung sind. Smarty und anderen Skripts brauchen noch mehr Zeit weil Sie eine eigene Skriptsprache besitzen und diese auch zusätzlich zu PHP nochmal kompiliert werden muss.

    Da ist die „per HTML“ Ausgabe immer noch schneller als Smarty & Co wie schon erwähnt wurde.

    Und ebenso stimmt es dass PHP ansich schon als Templatesprache gedacht/entwickelt wurde. Ein weiterer Einsatz von TPL-Engines ist also nicht nur überflüssig sondern auch ein Rückschritt.

  11. tecM0 sagt:

    @David: ich bin PHP-beginner und habe mich bisher immer über diese Teplate-Engines gewundert doch Stück für Stück merke ich, das meine Meinung nicht ganz falsch ist… sehe ich auch so… PHP an sich ist auch schon TPL genug.

    Z.B- hier…

    http://www.ajax-community.de/schaufenster/7018-mvc-framework.html

    Zitat auf seiner Website: „Anders als in vielen anderen Tutorials zum MVC-Prinzip verwende ich hier KEINE Template Engine wie Smarty. Ich verwende auch KEIN ORM-Framework wie Doctrine.

    Warum nicht?

    Weil ich erstens kein Fan von Fertigskripten bin und zweitens meine Gründe gegen Template-Engines habe. Sie verbrauchen nur unnötige Ressourcen und machen den Designern das leben schwer. Wozu hat denn PHP eine eigene Template-Syntax? Richtig! Um sie zu nutzen. Und genau das wird in diesem Tutorial geschehen.“

    Naja, nur so…. weitermachen! 😉

    Gruss,
    Sven

  12. Neuling sagt:

    Hi,

    der Grund dafür ist laut einem Bekannten der, dass es rechentechnisch schneller ist, die PHP-Daten zu „erstellen“, als diese von einer normalen Festplatte (ich gehe mal davon aus, dass du deinen Test nicht mit einer Ultraschnellen gemacht hast?) direkt zu lesen.

    Weiterhin muss man anmerken, dass es pauschal nicht vorhersagbar ist, welche Ausgabe schneller ist, da die Datenmenge vermutlich jedes mal eine andere ist. In deinem Beispiel dort oben, scheint die Lösung schneller zu sein, sollte es aber um die Verarbeitung großer Datenmengen gehen, ist es wahrscheinlich sinnvoll die Ausgabe des Scriptes, sofern sich die Daten nicht permanent ändern, via HTML-Datei zu speichern und nur diese wiederholt auszugeben.
    Dies war zwar nicht Thema des Beitrages, wollte ich aber, wie gesagt, einfach mal anmerken – zu einem solchen Thema hast du schließlich bereits ein paar Anregungen veröffentlicht.

    Es soll wohl immer darauf ankommen, was ausgegeben werden soll bzw. wie viel.

    Gruß

Eine Antwort schreiben

Ihre E-Mail-Adresse wird nicht veröffentlicht. Benötigte Felder sind markiert mit *

You may use these HTML tags and attributes: <a href=""> <blockquote cite=""> <pre lang=""> <b> <strong> <i> <em>