PHP Was ist schneller? Viele echos oder ein langes ?

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.658
Ich grüße euch liebe CB Gemeinde.

Mich quält nun schon seit langem eine Frage.
Es geht dabei um PHP und die Ausführungsgeschwindigkeit.

Jeder kennt das Problem, große HTMl Sachen wie tables o.ä. mit PHP auszugeben.

Es gibt da verschiedene möglichkeiten. Man kann die Table außerhalb von PHP schreiben, also so:
PHP:
<?PHP 
// einige anweisungen
?>
<table........
</table>
<?PHP
// weitere anweisungen
?>

macht den code für mich aber recht unleserlich und wenn man dann daten in die Table hauen will muss man jedesmal <? ?> schreiben.

die zweite möglichkeit besteht aus einem sehr langem echo, entweder mit . verknüpft oder aber direkt über mehere zeilen, quasi so:
PHP:
<?PHP
echo "<table>
            <tr>
               <td>
                ...........
           </table>";
//oder
echo "<table>" .
         " <tr>" .
         "............" .
         "</table>";

sieht beides schon ein wenig besser aus, aber am leserlichsten finde ich folgendes.
PHP:
<?PHP
echo "<table>";
echo " <tr>";
echo "  <td>";
echo " .......";
echo "</table>"; 
?>

nun ist meine frage ob es zwischen den 3 (bzw. 4) Methoden signifikante Geschwindigkeit unterscheide gibt.
Habe mich mal einem Benchmark versucht aber bin zu keinem schlüßigem Ergebnis gelangt da die Ausführungszeiten je nach Auslastung etc. extrem schwanken konnten. Manches mal hat auch ohne ersichtlichen Grund ein Script mal ne halbe Sekunde länger gedauert als der Durchschnitt. Das legt für mich entweder den Schluss nahe das es keinen großen Unterschied gibt oder PHP sich nicht für Benchmarks eignet.

Ich könnte mir vorstellen das die erste Anweisung am schnellsten geht weil der Parser alles außerhalb von <? ?> ignoriert und die letze Möglichkeit am längsten dauert weil es sehr viele echo befehle gibt.

Weiß da jemand genaueres und kann es evtl. erklären ?

MFG
Marc
 
Du wirst solange du nicht Seiten mit mehreren 1000 Zeilen Code schreibst annähernd gar keinen Unterschied feststellen können...

Wobei natürlich deine erste Variante am wenigsten CPU-Zeit in Anspruch nimmt, da nicht die gesamte Datei geparst werden muss.
 
Das war ja auch meine vermutung.
Nur der Code wird so wirklich extremst undurchschaubar, besonders wenn sich dann irgendwo ein <? } ?> versteckt nur um eine if-abfrage zu schließen.
Aber wenn der unterschied nicht wirklich groß ist bleibe ich bei den vielen echos ;)
Oder sind 3 echos länger in der ausführungszeit als ein langes weil 3 mal ein befehl ausgeführt wird ?

Und parsen muss er es doch so doer so ?
Wie will er sonst etwas wie <? echo "abc" ?> findnen in der table?
 
Laut meinen Dozenten ist es äußerst gruselig, jede Zeile per Echo auszugeben.
Er meint, es ist weitaus schöner, den kompletten HTML Inhalt in einem einzigen String zu speichern und diesen dann in einem Rutsch auszugeben.
So unrecht hat er da nicht. So wäre es auch machbar, einen validen HTML Code und ein konsistentes Layout zu erzeugen, wenn mal PHP ein Fehler melden sollte. Es sei denn, man benutzt Templates.
Jeder weitere Echo-Befehl verbrät CPU-Leistung. Bei Webanwendungen, die etwas mehr vom CPU verlangen, wäre die Methode, mit einem Echo, vorzuziehen.
 
wie du gesagt hast, sollte man auch keine Klamme schließen. Eine schließende Klamma kommt unter dem Block des if Elementes also so ungefähr:

PHP:
<?php
if (...) {
?>
HTML
<?php
}
?>
HTML
 
Der Unterscherschied ist einfach zu gering um sich um diesen zu kümmern, verwende lieber die sauberste und am besten lesbare Variante.
Jede Datenbankabfrage, Filesystem-Zugriff usw. wird ein deutlich größeres Performance-"Bottleneck" sein, also eine solche Mikro-Optimierung.


Meine liebste Variante:
PHP:
html
<?php foreach($this->userlist as $user): ?>
  html
  <?php echo $user->getName(); ?>
  html
<?php endforeach; ?>
html
Meiner Meinung nach deutlich lesbarer als mit geschweiften Klammern.
 
die benchmarks sprechen ja eine ganz eindeutige sprache.....
alles in eine variable zu speichern finde ich persönlich am unschönsten und erscheint mir, unabhänig vom Benchmark nich sehr schlau.
erstes muss eine Variable angelegt werden, also speicher geholt werden und diesen beschreiben, das macht deshalb keinen sinn weil der Code ja schon im speicher liegt, in form des scripts.
Dann muss diese variable für die Ausgabe wieder im Speicher gesucht und ausgelesen werden.
10 kb erscheinen mir da schon realistisch.
D.h. man hat 2 unnötige speicher zugriffe und wenn das script nun 100 mal / sekunde ausgefphrt wird haben wir schon 1000 kb, also knapp 1 MB speicher verbraucht. Hat man nun so große seiten wie FB mit hunderttausenden aufrufen pro sekunde, dannn gute nacht ^^
Und fehler sollten generel behandelt werden, da lobe ich mir java und exceptions ;)

Werde dann wohl versuchen das auf einzelne echos zu beschränken, denke bei meinem vorhaben wird man schon eine laufzeit verbesserung bemerken da wirklich verdammt viele Daten abgerufen werden, trotz partiellem nachladen der benötigten Daten.

die methode mit endforeach is mir auch neu, gibts auch sowas wie endwhile oder endfor (für zählbasiertes iterieren) und endif ?

XHP sagt mir nu irgendwie gar nich zu. Und da stellt sich dann wieder die frage in weit die XML erweiterung den parser ausbremst ;)

MFG
Marc
 
Zuletzt bearbeitet:
Benchmarks sind das eine. Das andere ist die Praxis. In einer ordentlich programmierten Anwendung hast du so wenig wie möglich print/echo im Code. Ansonsten wirst du relativ schnell mit der allseits bekannten "Cannot modify header information - headers already sent" Fehlermeldung konfrontiert werden. Deshalb müsstest du alle print/echo Befehle mit dem Outbuffer abfangen. Wieso nicht gleich den auszugebenden Inhalt in eine Variable packen und diesem am Ende einmal mit print/echo ausgeben (was übrigens eine gängige Methode ist)? Dafür eignet sich eine kleine Klasse:

PHP:
class Site {
   
   private $body = '';   

   public function setBody($body) {
      $this->body .= (string) $body;
   }

   public function render() {
      echo $this->body;
   }
}

// Anwendung

$foo = '<h1>Hello World</h1>';
$site = new Site;
$site->setBody($foo);
$site->render();


P.S. Zu deinem Ausgangspost: Definitiv die erste Variante in Verbindung mit der alternativen Syntax für Kontrollstrukturen, siehe http://php.net/manual/de/control-structures.alternative-syntax.php.
 
Zuletzt bearbeitet:
ich halte das aber immer noch für zu speicherlastig.
Und den header alredy sent kann ich nich bekommen da ich mir für header informationen ne klasse gebastelt habe und danach folgen die ausgaben. Außerdem lade ich alles per HTTP request und JS nach was ich brauche ;)

aber interessant ist diese diskussion auf jeden fall :)
 
Bei einer Website mit ein paar Seiten mag dies funktionieren, jedoch wirst du bei einem ernsthaften Projekt schnell den Überblick verlieren. Sofern du bereits eine Klasse für Header geschrieben hast, packe das einfach mit rein. In der Praxis wird das meist in einer Response Klasse zusammengefasst, z.B. bei Zend http://framework.zend.com/manual/de/zend.controller.response.html. Aber auch andere PHP Frameworks arbeiten ganz ähnlich.

Jedenfalls hat der übermässige Gebrauch von print/echo rein gar nichts mit professioneller Programmierung zu tun. Für ein paar Kleinigkeiten mag es ausreichend sein, mehr nicht. Lies am Besten mal etwas Literatur zum View / Template Entwurfsmuster, falls du dies nicht bereits getan hast.
 
Mercsen schrieb:
erstes muss eine Variable angelegt werden, also speicher geholt werden und diesen beschreiben, das macht deshalb keinen sinn weil der Code ja schon im speicher liegt, in form des scripts.
Dann muss diese variable für die Ausgabe wieder im Speicher gesucht und ausgelesen werden.
10 kb erscheinen mir da schon realistisch.
D.h. man hat 2 unnötige speicher zugriffe und wenn das script nun 100 mal / sekunde ausgefphrt wird haben wir schon 1000 kb, also knapp 1 MB speicher verbraucht. Hat man nun so große seiten wie FB mit hunderttausenden aufrufen pro sekunde, dannn gute nacht ^^
äh, der Speicher wird nur solange allokiert, wie auch der Request läuft, also nur wenige Millisekunden, von daher ist der Speicherverbrauch in diese Richtung fast irrelevant.


Mercsen schrieb:
Werde dann wohl versuchen das auf einzelne echos zu beschränken, denke bei meinem vorhaben wird man schon eine laufzeit verbesserung bemerken da wirklich verdammt viele Daten abgerufen werden, trotz partiellem nachladen der benötigten Daten.
du wirst absolut gar keinen Unterschied feststellen.
Jede Datenbankabfrage oder sogar schon das includen einer PHP-Datei (IO-Operation) wird mehr Zeit benötigen, als solche Mikro-Optimierungen mit dem Ausgeben der Daten.

Mercsen schrieb:
die methode mit endforeach is mir auch neu, gibts auch sowas wie endwhile oder endfor (für zählbasiertes iterieren) und endif ?
ja die gibt es alle ;)

Trainmaster schrieb:
Benchmarks sind das eine. Das andere ist die Praxis. In einer ordentlich programmierten Anwendung hast du so wenig wie möglich print/echo im Code.
ich würde weiter gehen und sagen, dass in der Praxis die Ausgabe von Daten die allerkleinste Zeit benötigt.

Trainmaster schrieb:
Bei einer Website mit ein paar Seiten mag dies funktionieren, jedoch wirst du bei einem ernsthaften Projekt schnell den Überblick verlieren. Sofern du bereits eine Klasse für Header geschrieben hast, packe das einfach mit rein. In der Praxis wird das meist in einer Response Klasse zusammengefasst, z.B. bei Zend http://framework.zend.com/manual/de/zend.controller.response.html. Aber auch andere PHP Frameworks arbeiten ganz ähnlich.
das Zend Framework ist genial, arbeite seit 3 Jahren nur noch damit.
 
Trainmaster schrieb:
Das andere ist die Praxis. In einer ordentlich programmierten Anwendung hast du so wenig wie möglich print/echo im Code. Ansonsten wirst du relativ schnell mit der allseits bekannten "Cannot modify header information - headers already sent" Fehlermeldung konfrontiert werden. Deshalb müsstest du alle print/echo Befehle mit dem Outbuffer abfangen. Wieso nicht gleich den auszugebenden Inhalt in eine Variable packen und diesem am Ende einmal mit print/echo ausgeben (was übrigens eine gängige Methode ist)? Dafür eignet sich eine kleine Klasse:

Sorry, bin zufällig auf diese Thema gestoßen. Was hat den >Cannot modify header information - headers already sent< mit einer mehrzeiligen Ausgabe durch echo zu tun? Diese Fehlermeldung kommt doch im einem ganz anderen Zusammenhang. Zudem halte ich es nicht für sinnvoll erst die komplette Seitenstruktur zusammenzusammeln und einem einen Rutsch auszugeben, da dies oft zu lange Wartezeiten durch Seitenaufbauzeiten mit sich bringt.
 
PeterParker101 schrieb:
Zudem halte ich es nicht für sinnvoll erst die komplette Seitenstruktur zusammenzusammeln und einem einen Rutsch auszugeben, da dies oft zu lange Wartezeiten durch Seitenaufbauzeiten mit sich bringt.
Ein PHP-Request benötigt doch sowieso nur sagen wir 8ms, was willst du da optimieren?
Die Übertragungszeit zum Client ist da deutlich länger. Zumal der Browser auch nicht unbedingt nach dem ersten Empfangenen Zeichen direkt beginnt die Webseite zu rendern, auch der Browser puffert eine gewisse Zeit bis begonnen wird, die Seite zu rendern.

Alles in allem nur sinnlose Mikrooptimierungen.
 
Warum eigentlich nicht ein richtiges Template System? Dafür ist PHP doch wie geschaffen, ist es doch fast selbst ein System wie oben gezeigt, aber das geht noch wesentlich eleganter.
 
Um jetzt noch einen neuen Aspekt einzubringen :D, in deinem Beispiel benutzt du double quotes, da diese geparset werden müssen dauert es länger den simplen HTML-Code auszugeben als mit single qoutes und so lange man seinen Code nicht mit Steuerzeichen pflastern will gibt es ja auch keinen wirklichen Grund für double quotes.
 
Zurück
Oben