Mittwoch, 10. Juli 2013

Warum die Templateengine Smarty nichts für High Speed Anwendungen ist

Bei uns - Powersoftware - laufen Applikationen mit der Templateengine komplett aus.
Der Grund ist einfach - unsere Leute erwarten maximal möglichen Speed .
Und genau das ist mit Smarty nicht möglich.

Um das einmal sehr knapp darzustellen folgende Test's .

1. leere index.php

Inhalt also


<?php

?>

dann Benchmark mit siege:


siege -b -c200 --time=1M  http://localhost/smartybuch/index.php
** SIEGE 3.0.1
** Preparing 200 concurrent users for battle.
The server is now under siege...
Lifting the server siege..      done.

Transactions:      424820 hits
Availability:      100.00 %
Elapsed time:       59.18 secs
Data transferred:        0.00 MB
Response time:        0.03 secs
Transaction rate:     7178.44 trans/sec
Throughput:        0.00 MB/sec
Concurrency:      196.73
Successful transactions:      424821
Failed transactions:           0
Longest transaction:        1.26
Shortest transaction:        0.00

2. index.php mit Smarty Basisinstallation

Inhalt also


<?php
require('Smarty.class.php');
$smarty = new Smarty;
?>

dann Benchmark mit siege:


siege -b -c200 --time=1M  http://localhost/smartybuch/index.php
** SIEGE 3.0.1
** Preparing 200 concurrent users for battle.
The server is now under siege...
Lifting the server siege..      done.

Transactions:      157365 hits
Availability:      100.00 %
Elapsed time:       59.02 secs
Data transferred:        0.00 MB
Response time:        0.07 secs
Transaction rate:     2666.30 trans/sec
Throughput:        0.00 MB/sec
Concurrency:      198.75
Successful transactions:      157365
Failed transactions:           0
Longest transaction:       15.28
Shortest transaction:        0.00

Wie man sehr deutlich erkennen kann  geht allein damit die Leistung rapide in den Keller - aber das allein sagt nicht viel aus, denn auch andere Applikationen die etwas einbinden würden leiden.

3. eine Miniaktion mit Smarty

index.php also nun so:



<?php
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->assign('hallo','Hallo Smarty');
$smarty->display('test.tpl');
?>

Wir weisen Smarty eine Variable mit dem Namen hallo und dem Inhalt Hallo Smarty zu und geben das über das Template test.tpl aus.

test.tpl sieht so aus:

{$hallo}

Smarty compiliert dieses Template einmalig und macht daraus dies:


<?php /* Smarty version Smarty-3.1.14, created on 2013-07-10 15:53:38
         compiled from "./templates/test.tpl" */ ?>
<?php /*%%SmartyHeaderCode:18813169651dd8382de6067-13084589%%*/if(!defined('SMARTY_DIR')) exit('no direct access allowed');
$_valid = $_smarty_tpl->decodeProperties(array (
  'file_dependency' =>
  array (
    '2319eb374ebfda6635cffe78ca7a13eed09695fd' =>
    array (
      0 => './templates/test.tpl',
      1 => 1373471506,
      2 => 'file',
    ),
  ),
  'nocache_hash' => '18813169651dd8382de6067-13084589',
  'function' =>
  array (
  ),
  'variables' =>
  array (
    'hallo' => 0,
  ),
  'has_nocache_code' => false,
  'version' => 'Smarty-3.1.14',
  'unifunc' => 'content_51dd8382e63548_69745676',
),false); /*/%%SmartyHeaderCode%%*/?>
<?php if ($_valid && !is_callable('content_51dd8382e63548_69745676')) {function content_51dd8382e63548_69745676($_smarty_tpl) {?><?php echo $_smarty_tpl->tpl_vars['hallo']->value;?>
<?php }} ?>

Und nun wieder der Benchmark:

siege -b -c200 --time=1M  http://localhost/smartybuch/index.php
** SIEGE 3.0.1
** Preparing 200 concurrent users for battle.
The server is now under siege...
Lifting the server siege..      done.


Transactions:      122140 hits
Availability:       99.69 %
Elapsed time:       59.94 secs
Data transferred:        1.40 MB
Response time:        0.10 secs
Transaction rate:     2037.70 trans/sec
Throughput:        0.02 MB/sec
Concurrency:      196.95
Successful transactions:      122140
Failed transactions:         378
Longest transaction:       28.07
Shortest transaction:        0.00


und gleich zum direkten Vergleich die gleiche Aktion mit php.

Das Script sieht so aus:


<?php
$test='Hallo Smarty';
echo $test;
?>

der Benchmark


siege -b -c200 --time=1M  http://localhost/smartybuch/index2.php
** SIEGE 3.0.1
** Preparing 200 concurrent users for battle.
The server is now under siege...
Lifting the server siege..      done.

Transactions:      422164 hits
Availability:      100.00 %
Elapsed time:       59.99 secs
Data transferred:        4.83 MB
Response time:        0.03 secs
Transaction rate:     7037.24 trans/sec
Throughput:        0.08 MB/sec
Concurrency:      196.47
Successful transactions:      422167
Failed transactions:           0
Longest transaction:        1.32
Shortest transaction:        0.00

Wie man unschwer erkennen kann ist Smarty bereits bei einem solchen Kleinkram der absolute Verlierer - die Performance bricht nicht nur radikal in sich zusammen sondern wirft auch noch Fehler.

Alle Test's wurden auf einem lokalen High Speed Server vorgenommen mit 32 GB RAM und System auf SSD Platte.

Auf dem gleichen Server bricht Smarty bei komplexen Systemen derart zusammen das da weniger als 20 trans/sec heraus kommen - voll im Gegensatz zu anderen Templateengines wie unser TPLE die da bei gleichen Inhalten noch locker 3073.21 trans/sec leisten.

Mit Smarty selbst haben wir viele Jahre gearbeitet - aber die Anforderungen ändern sich. Smarty hat von der Systematik einige Schwächen insbesondere auch der eigene Syntax der heute immer weniger erwünscht ist - PHP kennt man Smarty muss man lernen nur damit Smarty daraus wieder PHP macht - das wollen heute immer weniger Firmen bezahlen.

Auf der anderen Seiten wird nach absolut höchstmöglichen Speed verlangt, Der ist notwendig um Besucher und noch mehr Besucher bei gleichem Server befriedigen zu können und das alles mit kurzen Zeiten.







Keine Kommentare: