Udo: Smarty vs PHP

Hallo zusammen,

zur Zeit beschäftige ich mit der Trennung von Code u. Layout,
habe verschiedene Template-Engines ausprobiert u. auch deren
Performance getestet.

aufgefallen ist mir, das Smarty gegenüber einer PHP-Lösung
5 x langsamer ist

Beispiel:

Temlatelösung nur mit Php:

  
<?php  
$navigation = "<ul>  
 <li>Seite 1</li>  
 <li>Seite 2</li>  
 <li>Seite 3</li>  
 <li>Seite 4</li>  
</ul>  
";  
  
$title = "Templatetest mit Smarty u. PHP";  
  
$content = "Lorem ipsum Lorem ipsum Lorem ipsum  
Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum  
";  
  
include("php.tpl.htm");  
?>  

das Template (php.tpl.htm):

  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />  
<title><?php print $title; ?></title>  
</head>  
<body>  
  
<div id="navigation">  
 <?php print $navigation; ?>  
</div>  
  
<div id="content">  
 <h1><?php print $title; ?></h1>  
 <p><?php print $content; ?></p>  
</div>  
  
</body>  
</html>  

nun das gleiche mit Smarty:

  
<?php  
require('Smarty.class.php');  
  
$smarty = new Smarty;  
// ... $smarty Konfiguration ...  
$smarty->caching = TRUE;  
  
$navigation = "<ul>  
 <li>Seite 1</li>  
 <li>Seite 2</li>  
 <li>Seite 3</li>  
 <li>Seite 4</li>  
</ul>  
";  
  
$title = "Templatetest mit Smarty u. PHP";  
  
$content = "Lorem ipsum Lorem ipsum Lorem ipsum  
Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum  
";  
  
$smarty->assign('navigation', $navigation);  
$smarty->assign('title', $title);  
$smarty->assign('content', $content);  
$smarty->display('smarty.tpl.htm');  
?>  

das Smartytemplate lasse ich mal weg s.o
( anstatt <?php print $navigation; ?> {$navigation} )

zugegeben ist das Beispiel sehr simpel, in einer echten
Anwendung kommen dann noch Datenbankabfragen u. mehr dazu.
Ich hab allerdings meine Zweifel ob man durch das Caching
von Smarty die Zeit aufholen kann.

was meint Ihr ?

Grüße Udo

  1. Ich grüsse den Cosmos,

    aufgefallen ist mir, das Smarty gegenüber einer PHP-Lösung
    5 x langsamer ist

    Smarty _ist_ eine PHP-Lösung.

    Und ja, Smarty ist langsamer, als ein hartcodiertes Template, da Smarty praktisch ein Parser und Interpreter ist.
    Bei einem meiner Admintemplates dauert der Aufbau auf dem Testserver 10 Sekunden bei einer Quelltextgrösse von 195kb.

    Bei Frontends ist der Geschwindigkeitsunterschied aber marginal und ob der Besuher die Seite eine Sekunde früher oder später kriegt, völlig egal. Bandbreitenschwankungen machen da grössere Unterschiede.

    m.E. wiegen die Vorteile von Smarty (beim passenden Projekt) jeden Nachteil auf. Bei meinem CMS und einigen anderen Projekten rum um Webradios nutze ich nur Smarty, da die Syntax nicht zu schwer ist, der Server ohne besondere Installation auskommt (kein PEAR, wie bei meinen vorherigen Lösungen) und gepackte 160kb und entpackte 600kb keinen Webspace zum platzen bringen.

    Die Debugfunktion ist absolut genial und die Möglichkeit, eigene Funktionen zu integrieren, macht Smarty zur eierlegenden Wollmilchsau mit Düsenantrieb ~g~

    Wenn es nicht um jede Millisekunde ausführungszeit geht (dafür ist PHP sowieso ungeeignet), plädiere ich für Smarty.

    Möge das "Self" mit euch sein

    --
    Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
    ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    1. Hallo Manuel,

      und ob der Besuher die Seite eine Sekunde früher oder später kriegt, völlig egal. Bandbreitenschwankungen machen da grössere Unterschiede.

      Von wegen egal, eine Sekunde ist sehr viel, war für mich der
      Hautgrund Yahoo durch Google zu ersetzen, als Google noch nicht so bekannt war.

      Es gibt viele Seiten (Besonders Bilddatenbanken, die ich aufgrund
      der Geschwindigkeit ungern nutze.

      Gruss
      Meike

      1. Ich grüsse den Cosmos,

        Von wegen egal, eine Sekunde ist sehr viel, war für mich der
        Hautgrund Yahoo durch Google zu ersetzen, als Google noch nicht so bekannt war.

        Aha. Du wechselst, weil der Seitenaufbau eine Sekunde länger dauert? Woher weisst du, was der Aufbau aufgrund des Servers länger dauert und nicht aufgrund anderer Faktoren, wie Leitungsgeschwindigkeit, Rechnerauslastung usw?

        Es gibt viele Seiten (Besonders Bilddatenbanken, die ich aufgrund
        der Geschwindigkeit ungern nutze.

        Bei einer Sekunde unterschied? Sorry, aber entweder kannst du eine Sekunde nicht abschätzen oder du verwechselt eine Sekunde mit einer Minute.

        Die Userseiten meines CMS haben eine Erstellungszeit auf dem Server von ca. 0.2 Sekunden. Im Browser erscheinen sie zwischen 2 und 30 Sekunden, je nach Inhalt und Auslastung meines Servers.

        Wenn du jetzt also eine Bilddatenbank besuchst, die Bilder 30-60 Sekunden brauchen, bis sie auf deinem Rechner sind und du dann glaubst, eine Sekunde Rechenzeit (bei extrem komplexen Templates, bei einfache liegt die Ausführungszeit bei unter 0.1s) ist viel, ist das für mich Weltfremd und unrealistisch.

        Möge das "Self" mit euch sein

        --
        Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
        ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
        1. Hallo,

          also zu behaupten, dass im Web 1 Sekunde nichts ausmacht, ist

          • bei allem Respekt - absoluter Humbug.

          In groesseren Projekten gibt es meist extra ein Team von ein
          paar Leuten welches sich ausgiebig um die Performance bemueht.
          Denn die eine Sekunde vergroessert sich exponentiell mit der
          Anzahl der simultanen Zugriffe -> Servelasten.

          Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
          wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
          es jedoch alles andere als "egal".

          Mirko

          1. Ich grüsse den Cosmos,

            also zu behaupten, dass im Web 1 Sekunde nichts ausmacht, ist

            • bei allem Respekt - absoluter Humbug.

            Aha, ist das so?

            In groesseren Projekten gibt es meist extra ein Team von ein
            paar Leuten welches sich ausgiebig um die Performance bemueht.
            Denn die eine Sekunde vergroessert sich exponentiell mit der
            Anzahl der simultanen Zugriffe -> Servelasten.

            Klar, und die setzen auch PHP und Smarty ein ....
            Und die Serverlast hängt nicht von der Aufbauzeit sondern vom der Interpreterzeit ab. Du vergleichst Äpfel mit Birnen.

            Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
            wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
            es jedoch alles andere als "egal".

            Ein Moped mit nem Ferrari zu vergleichen, nur um ein Argument zu finden, wieso es im Internet wichtig ist, eine Seite mit Smarty eine Sekunde schneller aufzubauen, ist - bei allem Respekt - schwachsinn.

            Fruchtlose Diskussion, weil am Thema vorbei argumentiert wird.

            Möge das "Self" mit euch sein

            --
            Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
            ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
            1. Guten Abend,

              zuerst einmal eine Bemerkung zu deinem Posting - zwei Sachen sind mir dabei aufgefallen:

              Zum einen: Du gehst bereits zu Beginn in die Rechtfertigungs- und Fingerzeig-Rolle ueber,
              was mich darauf schliessen laesst, dass du dich a) persoenlich angegriffen oder b) durch
              ein einfaches Posting bereits herausgefordert fuehlst oder c) einfach nur rumstaenkern
              moechtest.
              Und zum anderen wirfst Du mir eine "Fruchtlose Diskussion" vor - doch ist die Art deiner
              Reaktion genau jenes Verhalten, welches Du augenscheinlich an mir kritisert hast.
              Ist es nicht so, dass man bei anderen Leuten genau jene Sachen sieht und bemaengelt,
              welche in einem selbst am staerksten vorhanden sind?

              Bevor Du dich der rhetorische Frage annimmst gehe ich nun auf das von dir
              Geschriebene ein:

              In groesseren Projekten gibt es meist [...]
              Klar, und die setzen auch PHP und Smarty ein ....

              Du uebersiehst, dass es hierbei um die eine Sekunde im Web geht - und nicht um die
              zugrunde liegende Serversprache.

              Anzahl der simultanen Zugriffe -> Servelasten.
              Und die Serverlast hängt nicht von der Aufbauzeit sondern vom der Interpreterzeit ab.

              Ich sagte, dass eine hoehere Anzahl an Zugriffen die Serverlast erhoeht.
              Und Du wirfst wir darauf hin vor, dass ich die Aufbau- und Interpreterzeit verwechsle.
              Dazu kann ich dir direkt die folgende Zeile wiedergeben, denn ich kann sie nicht gebrauchen:

              Du vergleichst Äpfel mit Birnen.

              Bei einer kleinen Gabis-Kaffee-Klatsch-Homepage kann man das
              wohl vernachlaessigen, bei Zugriffen >5000 die Stunde ist
              es jedoch alles andere als "egal".

              Ein Moped mit nem Ferrari zu vergleichen, nur um ein Argument zu finden, wieso es im
              Internet wichtig ist, eine Seite mit Smarty eine Sekunde schneller aufzubauen, ist -
              bei allem Respekt - schwachsinn.

              An dieser Stelle verweise ich nochmal auf deine, von mir am Anfang bereits erwaehnte,
              (Re)aktion in deinem Posting.
              a) die von mir angegebene Anzahl an Zugriffen ist doch keine Ferrari! Ich bitte dich..
              b) ich bleibe dabei: 1 Sekunden im Web ist signifikant. Sowohl eine an sich, als auch
              die Addition. Denn aus einer Sekunde wird nach ein paar Erweiterungen schnell zwei, aus
              zwei dann drei usw. usf.
              c) Bezgl. Smarty und das nicht-verstehen-wollen deinerseits, dass es um die benoetigte
              Zeit _unabhaengig_ von der zugrunde liegenden Sprache ging und eben nicht um Smarty als
              solches - mal wieder einen Satz den Du von mir liebevoll zurueckbeckommst:

              [..] am Thema vorbei argumentiert wird.

              Ich wuensche Dir noch einen angenehmen Sonntag
              Mirko

    2. (Hallo|Hi(ho)|Tag) Manuel B.,

      Und ja, Smarty ist langsamer, als ein hartcodiertes Template, da Smarty praktisch ein Parser und Interpreter ist.

      Das ist PHP auch. Alles, was Smarty kann, kann PHP auch. Wenn ich mich nicht irre, wurde es extra dazu entworfen, um "Hypertext" zu "parsen" und zu "interpretiere". Es hat eine Unmenge an leistungsfähigen Funktionen, um Texte zu verarbeiten, Muster zu suchen und zu ersetzen. Wozu also in einer interpretierten Skriptsprache einen Interpreter für eine weitere Skriptsprache schreiben, wenn man das Original benutzen kann?

      m.E. wiegen die Vorteile von Smarty (beim passenden Projekt) jeden Nachteil auf. Bei meinem CMS und einigen anderen Projekten rum um Webradios nutze ich nur Smarty, da die Syntax nicht zu schwer ist, ...

      Wenn man eh PHP beherrscht, warum sollte man extra eine zusätzliche Sprache lernen?

      ... der Server ohne besondere Installation auskommt (kein PEAR, wie bei meinen vorherigen Lösungen) ...

      Auch darauf kann man mit reinem PHP verzichten.

      Die Debugfunktion ist absolut genial und die Möglichkeit, eigene Funktionen zu integrieren, macht Smarty zur eierlegenden Wollmilchsau mit Düsenantrieb ~g~

      "Nur-PHP" lässt sich ebenfalls um eigene Funktionen erweitern. Debugger gibts dafür auch.

      Wenn es nicht um jede Millisekunde ausführungszeit geht (dafür ist PHP sowieso ungeeignet), plädiere ich für Smarty.

      Kann man wirklich mit Smarty schneller ein "Layout" zusammenbasteln als mit PHP-Code? Wenn ja, dann nehme ich alles zurück. Wenn nicht, dann frage ich mich, warum man mit Smarty (und anderen umfangreichen "Template-Engines") auf PHP ein System draufsattelt, das im Prinzip das Gleiche leistet wie PHP. Es macht zumindest den Eindruck, als ob manche Webentwickler den Wald vor lauter Bäumen nicht mehr sehen.

      http://www.phpguru.org/static/templating.html

      http://www.massassi.com/php/articles/template_engines/

      MffG
      EisFuX

      1. Ich grüsse den Cosmos,

        Kann man wirklich mit Smarty schneller ein "Layout" zusammenbasteln als mit PHP-Code? Wenn ja, dann nehme ich alles zurück.

        Ja, kann man. Jeder, der HTML kann, wird relativ problemlos ein Smarty-Template entwerden können, ohne auch nur Ansatzweise was mit PHP zu tun zu haben.

        Wenn nicht, dann frage ich mich, warum man mit Smarty (und anderen umfangreichen "Template-Engines") auf PHP ein System draufsattelt, das im Prinzip das Gleiche leistet wie PHP. Es macht zumindest den Eindruck, als ob manche Webentwickler den Wald vor lauter Bäumen nicht mehr sehen.

        Smarty leistet etwas völlig anderes. Und zwar die 100%ige Trennung von Code und Design. Und genau das ist der Sinn von Templateengines.
        Abgesehen davon, das hartkodierte Templates wesentlich schwerer zu ändern sind (Von einem Nichtprogrammierer praktisch gar nicht) und ein Templatewechsel nicht einfach durch austauschen eine (Quasi)-HTML-Datei zu erreichen ist.

        Und das Template-Engines ihre Bereichtigung haben, zeigen Projekte wie Joomla, die ohne Templateengine nicht mehr im Design anpassbar wären, da die Komplexität schlichtweg zu gross ist.

        Möge das "Self" mit euch sein

        --
        Neulich dachte ich mir, einmal S/M ausprobieren wäre eine tolle Erfahrung. Also hab ich Windows gebootet ...
        ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
      2. Hallo,

        http://www.phpguru.org/static/templating.html
        http://www.massassi.com/php/articles/template_engines/

        Mit beiden Ansätzen habe ich genau 2 Probleme:

        * Beide setzen short_open_tag = On voraus, denn <?=$foo?> geht eben nur bei
           aktiviertem short_open_tag. Wenn short_open_tag deaktiviert ist, muss ich
           <?php echo $foo; ?> machen - was dann bei vielen Variablen schnell sehr
           umständlich wird. short_open_tag kann man aber nicht voraussetzen, wenn
           man portable Software schreiben will.
         * Für einfache Variablen, die man nur ausgeben will, ist das sicherlich
           ganz brauchbar zu nutzen. Allerdings sind Template-Engines wie z.B.
           Smarty explizit als Template-Engines und eben *nicht* als Programmier-
           sprache konzipiert worden. Ok, man kann auch Smarty-Templates schreiben,
           in denen nur noch programmiert wird, die komplett unübersichtlich sind,
           aber blödsinnigen Code kann man so ziemlich überall fabrizieren. Smarty
           dagegen bietet eine Syntax an, die gerade auf Templates optimiert ist -
           bei PHP ist das nicht so direkt der Fall. Mal ein paar Beispiele:
               - Wenn ich in PHP eine Variable nochmal durch eine Funktion jagen
                 will, z.B. htmlspecialchars(), dann muss man sowas schreiben:
                 <?php echo htmlspecialchars ($variable); ?>
                 oder, bei short tags: <?=htmlspecialchars ($variable)?>
                 Das ist zwar prinzipiell kein Problem, aber macht den Code IMHO
                 schnell sehr übersichtlich, wenn dann auch noch andere Funktionen
                 dazukommen, z.B. nl2br:
                 <?php echo nl2br (htmlspecialchars ($variable)); ?>
                 (oder <?=nl2br (htmlspecialchars ($variable)); ?>)
                 In Smarty kann man dagegen schreiben:
                 {$variable|escape|nl2br}
                 Das ist für eine Template-Sprache (!) eine viel sinnvollere
                 Syntax - IMHO zumindest.
               - Template-Engines nehmen einem auch eine ganze Menge Arbeit ab
                 und ermöglichen es, einem das Leben leichter zu machen. Bei
                 Smarty gibt's z.B. {html_options options=$Options selected=$sel}
                 erzeugt lauter <option value="KEY">VALUE</option> aus dem $Options
                 Array und selektiert automatisch KEY = $sel. Ferner gibt's so
                 nette Dinge wie {cycle}: Du willst z.B. jede zweite Tabellenzelle
                 andersfarbig ausgeben, weist ihnen also verschiedene Klassen zu.
                 Das kannst Du so machen, indem Du in die Schleife selbst einfach
                 <tr class="{cycle values="odd,even"}"> schreibst - Smarty
                 übernimmt dann den Rest für Dich. Ferner stehen Dir in Schleifen
                 eine ganze Menge Informationen über die Schleife selbst zur
                 Verfügung über spezielle Tags (ist dies das erste oder letzte
                 Element etc) - die Dir in PHP ohne Nacharbeit nicht zur Verfügung
                 stehen. Nur, um mal ein paar einfache Beispiele zu nennen.

        Natürlich kannst Du _alles, was Du in Smarty kannst, auch in PHP
                 machen - allerdings nur dadurch, dass der Code *im Template*
                 wächst und bei komplexeren Dingen unübersichtlich wird. Ich
                 bezweifle gar nicht, dass einfaches PHP für *EINFACHE* Anwendungen
                 durchaus die bessere Alternative ist, da schlanker. Sobald das
                 ganze jedoch komplizierter wird, dann nehmen einem Template-
                 Engines eine *ganze* Menge Arbeit ab, entschlanken den Code und
                 führen dazu, dass man sich beim Schreiben der Templates auf das
                 wesentliche konzentrieren kann - und sich nicht mit Neben-
                 sächlichkeiten auseinandersetzen muss.

        Zudem: Zumindest Smarty wandelt alle Templates in PHP um, und
                 bindet diese "kompilierten" Templates dann per include() ein -
                 damit ist der Geschwindigkeitsvorteil von reinem PHP praktisch
                 gleich Null, sobald die Templates mal kompiliert sind, denn
                 der Overhead durch Smarty selbst ist relativ gering.

        Viele Grüße,
        Christian

  2. (Hallo|Hi(ho)|Tag) Udo,

    Ich hab allerdings meine Zweifel ob man durch das Caching
    von Smarty die Zeit aufholen kann.

    Wenn Caching nicht hilft, sollte man über den Einsatz eines PHP-Accelerators nachdenken.

    MffG
    EisFuX