Performance: echo benutzen ja oder nein?
nokill
- php
0 chris0 Andreas Korthaus0 ComLar0 nokill
Hi,
ich stehe derzeit vor dem Problem ob es besser ist verschiedene Sachen mit echo aus geben zu lassen oder sie mit HTML, also ganz normal, ausgeben zu lassen. Mich wüder vor allem interessieren welche Methode schneller ist, schließlich will man Modemnutzer freundlich sein ;)
Aber am besten ich gebe dazu ein Beispiel (mit je 2 Dateien):
echo-Version:
index.php:
----------------------------------------------
<?
//includes
include("includes/meta/master_meta.php");
?>
<html>
<head>
<title>Test</title>
<? echo $meta; ?>
</head>
<body>
<div>
Viel Inhalt
</div>
</body>
</html>
----------------------------------------------
master_meta.php:
----------------------------------------------
<? $meta='<meta name="title" content="Test">
<meta name="copyright" content="nokill">
';
?>
----------------------------------------------
und jetzt die 2. Version in der auf echo verzichtet wird:
index.php:
----------------------------------------------
<html>
<head>
<title>Test</title>
<? include("includes/meta/master_meta.php"); ?>
</head>
<body>
<div>
Viel Inhalt
</div>
</body>
</html>
----------------------------------------------
master_meta.php:
----------------------------------------------
<meta name="title" content="Test">
<meta name="copyright" content="nokill">
----------------------------------------------
So ich denke jetzt habt ihr eine Vorstellung von meinem Problem.
Ich wäre über eine schnelle Antwort erfreut.
cya nokill
Hi nokill!
Ich denke, von der Performance her gesehen
dürfte das überhaupt nicht ins Gewicht fallen...
Generell finde ich den Ansatz mit dem includen
wesentlich hübscher, da Du hier ja schon HTML von
PHP trennst! Du findest Dich bei späteren Änderungen auf komplexen
Seiten einfach schneller zurecht.. Ich benutze um mir oder Anderen dasÄndern der Seite zu vereinfachen Smarty als Template
Engine... Der Zweck des Ganzen steht natürlich außer
Frage! Kann diese vorgehensweise nur empfehlen! Ist
natürlich wieder total das Streitthema und hierbei scheiden
sich wie so oft die Geister...
Guck einfach mal auf http://smarty.php.net
Wenn Du Dir nicht sicher bist, was schneller ist, zähl doch
einfach die verstrichenen Millisekunden!
Nochn schönen Abend und viele Grüße!
Chris
Hi Chris,
welche Version meinst du, die 1. oder 2. haben in ja in beiden include verwendet, aber ich gehe davon aus, dass du die 1. mit echo meinst.
Ich finde die 1. ja auch übersichtlicher.
Und danke zu dem Tipp mit den Templatesystem Smarty, ich habe mich schon mit Smarty und einem anderem Template system beschäftigt, aber ich nehme doch lieber eine der beiden Möglichkeiten, die gepostet habe.
Eines noch wie kann ich die Millisekunden messen? Ich habe schon an sowas gedacht, weil man das bei (ich glaube jeder will aber nicht lügen, deshalb ist diese Aussage ohne Gewähr) Phpkitseiten gesehen habe dort steht dann "Webseite generiert in x.xxx Sekunden", oder sowas.
cya nokill
Hallo Chris!
Und danke zu dem Tipp mit den Templatesystem Smarty, ich habe mich schon mit Smarty und einem anderem Template system beschäftigt, aber ich nehme doch lieber eine der beiden Möglichkeiten, die gepostet habe.
Performance ist nicht alles, ein Template-System bietet viele Vorteile. Außerdem ist Smarty z.B. in der Lage HTML zu cachen, wodurch es möglicherweise sogar schneller wird :)
Bedenke beim Einsatz von Templates aber immer - verlagere keine Applikations-Logik in die Templates. Auch wenn Smarty mächtig ist, man sollte so wenig wie möglich Funktionen/Funkalitäten im Template verwenden.
Eines noch wie kann ich die Millisekunden messen? Ich habe schon an sowas gedacht, weil man das bei (ich glaube jeder will aber nicht lügen, deshalb ist diese Aussage ohne Gewähr) Phpkitseiten gesehen habe dort steht dann "Webseite generiert in x.xxx Sekunden", oder sowas.
siehe: http://www.dclp-faq.de/q/q-code-performance.html
so z.B.
Grüße
Andreas
Das wäre zum Beispiel auch ne Möglichkeit, die
ich gerne verwende:
Auszug:
//parse html template
if ($HTTP_GET_VARS["page_id"]=="home") {
require_once ("press.php");
listfiles($directory,$headfile,$sfile, $pages);
$fd = @fopen ("layerstylez.tmpl.html", "r");
$stylez = fread ($fd, filesize ($filename));
fclose ($fd);
$fd = @fopen ("layercontentz.tmpl.html", "r");
$contentz = fread ($fd, filesize ($filename));
fclose ($fd);
$xtpl->assign("LAYERSTYLEZ", $stylez);
$xtpl->assign("LAYERCONTENTZ", $contentz);
$xtpl->assign("TICKER", $ticker);
} else {
$xtpl->assign("LAYERSTYLEZ","");
$xtpl->assign("LAYERCONTENTZ", "");
}
$xtpl->assign("DOTB", $dotbcg);
$xtpl->assign("SPACER", $spacerstatus);
$xtpl->assign("COLOR",$row);
$xtpl->assign("PIC",$bigleft);
$xtpl->assign("STAT",$mainlinks);
// READ PRESSLOFT FILES
if($HTTP_GET_VARS["page_id"]=="press")
{
$di = $HTTP_GET_VARS["di"];
include ("press.php");
// CALLING FUNCTION LISTFILES IN MAINDIRECTORY
switch ($HTTP_GET_VARS["fct"])
{
case"";
if($HTTP_GET_VARS["type"]!="1"){
// CONTENT FILE READING
$fd = @fopen ($filename, "rb");
if ($fd) {
$info = fread ($fd, filesize ($filename));
fclose ($fd);
}
}
listfiles($directory,$headfile,$sfile, $pages);
break;
case"more";
listfiles_more($directory,$headfile,$sfile_more,$di,$word,$txt,$images,$zip,$directory_archiv);
break;
}
usw....
Vom Prinzip her auch nicht anders als Smarty...
Viele Grüße
Chris
Hi nochmal :-)
Ich finde die 1. ja auch übersichtlicher.
Ich meinte schon die erste Variante...
Eines noch wie kann ich die Millisekunden messen?
Am Anfang deines Scriptes:
$start = microtime();
Am Ende der jeweiligen Funktion, welche die aktuelle
Seitenansich rendert:
echo "<br><center>[ Script Execution Time: " . (microtime() - $start) . " sek ]</center>\n";
Das sollte es gewesen sein... Schließ mich im Übrigen hier
Andreas an! Die Millisekunden kratzen nicht wirklich! Lediglich
bei stark frequentierten Seiten dürfte man hier etwas bemerken...
Viele Grüße
Chris
Hi Chris,
danke für die erklärung der Verwendung von der Funktion microtime();
werde sie sicher noch oft brauchen
mfg nokill
Hallo nokill, hallo Chris,
ein Nachtrag, da im Beispiel eine häufiger Fehler ist, der erst später durchschlägt:
Wegen http://www.php.net/microtime: "[...] gibt diese die Zeichenkette "msec sec" zurück [...]" schaut Euch mal http://www.dclp-faq.de/q/q-code-performance.html an, und dort besonders:
list($low, $high) = explode(" ", microtime());
$t = $high + $low;
Gruß, Thoralf
Hallo!
So ich denke jetzt habt ihr eine Vorstellung von meinem Problem.
Ich wäre über eine schnelle Antwort erfreut.
Naja, "Problem" würde ich das nicht unbedingt nennen ;-)
Gerade wo Du Modem-Benutzer ansprichst - auf die Ladezeit hat Dein "Problem" keinerlei merkliche Auswirkung. Das spielt sich alles im Millisekundenbereich ab und lässt sich vermutlich kaum messen.
Das was man dagegen erheblich merkt, ist Komprimierung und Caching!
Ob eine Seite jetzt 20 KB groß ist, oder nur 4, das merkt ein Modem-User durchaus, denn die eine Seite dauert 4 Sekunden, die andere nichtmal 1. Ob jetzt Deine echos irgendwo 0,0003 Sekunden raushauen interessiert da nicht wirklich, oder? ;-)
Die andere Sache ist Caching, wenn Du verhinderst dass der Modem-User bei jedem Request alle Bilder, Javascripte, CSS... neu auf Aktualität überprüft, oder im schlimmsten Fall jedes mal neu läd, werden Deine Seiten sparst Du wieder ne ganze Menge.
Dann bringt es noch ne Menge möglichst "effiziente Algorithmen" zu verwenden, wenn Du irgendwas programmierst, da gibt es auch große Unterschiede in der Implementierung.
Nicht zuletzt lässt sich auch auf anderen Ebenen als HTTP cachen, also auch HTML-Ausgaben von PHP-Scripten, Datenbank-Ergebnisse... usw.
Naja, und von wegen echos - ich habe das nie gemessen, könntest Du ja mal machen um wirklich sicher zu gehen ;-) Hier mal ein paar Dinge die ich hier und da mal gelesen habe:
Wie gesagt, das ganze spielt sich im Mikrosekundenbereich ab, und ist kaum messbar.
Grüße
Andreas
Hallo Andreas,
dass print langsamer ist als echo ist definitiv war! Bei den beiden anderen Methoden bin ich mir nicht sicher.
wie genau funktioniert das mit dem Chaching?
cya nokill
Hallo!
dass print langsamer ist als echo ist definitiv war! Bei den beiden anderen Methoden bin ich mir nicht sicher.
Ich mir aber ;-)
Naja, kommt drauf an was man macht. Jede Version hat seine Vor- und Nachteile. Und auch performance-mäßig. Aber bei bloßem Text ist es so wie ich gesagt habe.
wie genau funktioniert das mit dem Chaching?
Gucke mal in die Dokumentation Deines Webservers. Da gibt es möglicherweise entsprechende Konfigurations-Direktiven, beim Apachen z.B. mod_expires: http://httpd.apache.org/docs-2.0/mod/mod_expires.html.
Wenn Dich das Thema interessiert und Du ein bisschen Zeit mitbringst, empfehle ich sehr folgende Präsentation zum Thema zu lesen: http://caching.ulf-wendel.de/
Grüße
Andreas
Hi,
ich stehe derzeit vor dem Problem ob es besser ist verschiedene Sachen mit echo aus geben zu lassen oder sie mit HTML, also ganz normal, ausgeben zu lassen. Mich wüder vor allem interessieren welche Methode schneller ist, schließlich will man Modemnutzer freundlich sein ;)
Also nicht, dass ich jetzt gefährliches Halbwissen verbreitet, aber:
Spielt das eine Rolle ob die Seite ein Modemnutzer ansieht oder wer mit DSL? PHP generiert die Seite doch auf dem Server, also spielt es keine Rolle, ob man das mit Modem oder DSL ansieht. Der Datenfluss der fertigen Seite vom Server zum Besucher ist dann natürlich unterschiedlich.
Liege ich falsch??
MfG
Hi ComLar,
das php auf dem Server generiert wird ist korrekt, denn php ist eine serverseitige Programmiersprache, daher müsste deine Aussage korrekt sein.
cya nokill