Performances de Smarty 2.6, 3.0beta et Dwoo

MISE A JOUR : 22 juillet 2010
les tests des versions de smarty 3.0 : RC1, RC2 et RC3 montre les mêmes performances que smarty 3.0b9, aucune changement notable. Ces Release Candidate apporte essentiellement de la stabilité et corrige des problèmes de sécurité.

Performances de Smarty 2.6, 3.0beta et Dwoo

Le but de ce test est d’évaluer quel moteur de template est le plus adapté dans un environnement professionnel. Ici je m’intéresse exclusivement à Smarty et Dwoo. Smarty est le gestionnaire de template que nous utilisons depuis déjà 3 ans, avec lequel l’équipe Emisfr est à l’aise. Dwoo quant à lui est un « fork » de Smarty mais orienté Objet. Smarty 3.0 est la version en cours de développement et qui a pour but de passer Smarty en PHP Objet, Smarty 2.x étant encore assez orienté PHP4, cette version 3.0 est la réponse aux problématiques PHP5 et PHP Objet. D’autres moteurs de template existent, comme Template Lite, également dérivé de Smarty.

Environnement :

dual core Athlon 4200+
Ram : 3.3Go
Apache : 2.2.13
Mod_PHP : 5.2.11 + APC
Apache Bench : 2.3

Les versions testées seront les suivantes :

Smarty 2.6.26 : actuellement stable
Smarty 3.0b7 : version beta précédente, elle nous permettra de voir l’évolution d’une beta à l’autre
Smarty 3.0b8 : dernière version beta
Dwoo 1.1.1 : actuellement stable

Les tests :

Rendu d’une page sans le cache du moteur de template activé. On ne parle pas ici de APC ou autre, mais bien du moteur de cache du moteur de template. Son but est de transformer le code « tpl » en code PHP.
On ressortira la mémoire maximum consommée (memory peak), et également le temps de rendu de cette page.

Cache activé
Site a forte charge
Force compilation
jamais utilisé en production
juste pour avoir une idée
des performances
Vérification de la compilation
configuration en développement
Pas de vérification de la compilation
configuration en production
la plus utilisée
cache_lifetime=-1
caching=1
force_compile=false
cache_lifetime=0
caching=0
force_compile=true
cache_lifetime=0
caching=0
check_compile=true
cache_lifetime=0
caching=0
check_compile=false
KINDTEST s3b8_rps s3b8_tpr s3b7_rps s3b7_tpr s2_rps s2_tpr dwoo_fail dwoo_rps dwoo_tpr
cache_enabled 167,98 29,77 186,67 26,79 247,05 20,24 1 187,85 26,62
force_compile 16,33 306,24 16,72 299,05 62,38 80,15 569 37,2 134,41
force_checkcompile 126,96 39,38 131,83 37,93 187,37 26,69 866 108,49 46,09
no_checkcompile 127,39 39,25 132,69 37,68 184,89 27,04 121 111,99 44,65

Ensuite on testera la montée en charge des moteurs, toujours avec et sans cache. Le test est effectué avec « ab » (apache bench) dont les paramètres sont : 1000 requêtes, 5 requêtes concurrentes. On ressortira le nombre de requêtes servies par seconde, le nombre de requêtes ayant amené à une erreur (Fail), et le temps moyen pour une requête.

Analyse du temps d’exécution

Execution time
Execution time

Analysons le comportement des moteurs lorsque le cache est activé. On peut voir qu’à l’exeption de Dwoo, les moteurs sont en dessous de 15ms, avec un avantage pour Smarty 2.6 qui est à 9ms ce qui constitue le meilleur temps, mais suivis de très près par Smarty 3.0beta avec 13ms. La question qui se pose est pourquoi une fois compilé les pages PHP générées par Smarty 2.6 sont-elles plus rapides à charger. Pour avoir la réponse à cette question il faudra regarder dans le code source. On peut en déduire que c’est certainement le chargement du moteur en lui même qui est le plus long sur Dwoo et Smarty 3.0b.

Voyons quels sont les résultats lorsque l’on force la compilation. On peut voir que Dwoo et Smarty 2.6 sont les meilleurs avec respectivement 55ms et 27ms. Par contre les deux versions de Smarty 3.0b, sont trois fois plus lentes avec un temps supérieur à 100ms. On peut donc penser que l’équipe de Smarty n’a pas encore fait de phase d’optimisation sur la génération de template. Ces chiffres sont à relativiser, car la génération sans cache n’intervient qu’une seule fois : lors du premier accès à la page en question, ceci n’est donc pas problématique en soi, mais il faudra penser à ne pas forcer la compilation des templates (ce qui est normalement jamais le cas).

C’est danse les configuration « développement » et « production commune » que l’on obtien les meilleures temps avec moins de 15ms pour l’ensemble des participant. On peut alors se demander pourquoi avec le cache activé les performances ne sont pas les meilleures.

Taille des bibliothèques :
Smarty 2.6 : 74,7 Ko (2classes) + 44,1 (22 sysplugins) + 104.6Ko (45 plugins) = 223,4Ko (69 fichiers)
Smarty 3.0b7 : 19Ko (1 classe) + 511 Ko (134 sysplugins) + 97,8 Ko (42 plugins) = 627,8Ko (177 fichiers)
Smarty 3.0b8 : 26,6Ko (1 classe) + 511Ko (60 syspluigns) + 97,8Ko (42 plugins) = 635,4Ko (103 fichiers
Dwoo 1.1.1 : 42,5 (1 classe) + 223Ko (37 syspluigns) +130,7Ko (63 plugins) = 396,2Ko (101 fichiers)

On peut voir que Smarty 2.6 est la bibliothèque la plus légère. Et Smarty 3.0b la plus lourde (plus de 2 fois plus lourde). Dwoo est quand à lui 50% plus lourd que Smarty 2.6, cela explique certainement la différence de temps d’affichage d’un template compilé mais pas seulement. Le nombre de fichiers à lire est également important pour Dwoo est Smarty 3.0b, le temps d’accès au disque peut expliquer également cela. Il existe des versions « compilées » de Smarty et Dwoo (non utilisé pour ces tests) qui permettent le chargement d’un seul fichier, le temps d’accès disque ainsi que le parsing sont réduits. Cependant Smarty 2.6 restera plus rapide compte tenu de son faible poids.

Analysons maintenant l’empreinte mémoire de ces moteurs de template

Memory
Memory

Précédemment nous avons pu voir que l’avantage allait indéniablement à Smarty 2.6 qui s’avère être le plus rapide, voyons maintenant ce qu’il en est pour l’empreinte mémoire.

Quelle est la consommation de mémoire lorsque le cache est activé ? Lorsqu’une application est en production le cache est activé pour éviter de compiler les templates à chaque appel, cette valeur à donc une certaine importance.
Dans cette configuration, tous les moteurs sont en dessous de 850Ko, ce qui est un bon point, on remarquera que Smarty 2.6 est à 585Ko ce qui constitue le meilleure score. Dwoo et Smarty 3.0beta ont une consomation un peut supérieur à celle de Smarty 2.6 mais rien d’alarmant.

Lorsque le moteur de template est configuré sans cache, le moteur doit compiler entièrement le fichier template, pour cela il passe par plusieurs phases, comme l’analyse syntaxique, puis la transformation en code php à proprement parler. On peut voir que Smarty 3.0b consomme deux fois plus de mémoire que Smarty 2.6 avec 2,4Mo utilisés. L’explication est assez simple, lors de la compilation, le moteur analyse le code qui peut potentiellement utiliser des plugins, nous avons vu plus haut que Smarty 3.0b a une centaine de fichiers « plugins » et « sysplugins » qu’il doit charger pour compiler les templates ; ils représentent environ 600Ko, contre 140Ko pour Smarty 2.6 et 350Ko pour Dwoo. Intéressons nous maintenant aux bons élèves que sont Dwoo et Smarty 2.6. Dwoo est à 1,5Mo ce qui constitue un bon score, mais qui évidement s’il est revu à la baisse sera un atout. Smarty 2.6 est le moteur qui consomme le moins de mémoire avec 1,0 Mo. On peut expliquer cela par son faible poids, et des optimisations plus poussée.
Comme pour les tests sur le temps tout à l’heure, la consommation de mémoire lorsque le cache est désactivé n’est pas la valeur la plus importante car en production le cache est activé et on arrive dans cette situation uniquement lors du premier appel à la page.

En mode « développement » et « production commune », la consomation de mémoire est strictement identique. avec des valeurs en dessous de 760Ko. Comme toujours Smarty 2.6 est le plus légé avec 525Ko.

Dans cette première partie de tests nous avons pu voir que Smarty 2.6 est le meilleur moteur de template aussi bien en terme de consommation mémoire qu’en terme de rapidité de traitement, que le cache soit activé ou non. Dwoo est bien placé également. Smarty 3.0b a des résultats assez proches de ceux de son grand frère Smarty 2.6, mais il n’est malheureusement pas meilleur et a une consommation mémoire trop importante lorsque l’on force la compilation. Dwoo quant à lui a des résultats corrects et se situe entre Smarty 2.6 et Smarty 3.0.

Nombre de requêtes servies par seconde

Request per second
Request per second

Voyons maintenant comment ces moteurs supportent la charge. En environnement de production certains sites à forte charge peuvent recevoir des milliers de requêtes il est important de connaitre le comportement de ces moteurs de template dans ce cas précis.

Nous allons nous intéresser dans un premier temps au nombre de requêtes servies par seconde, tout d’abord lorsque la compilation est forcée. Les courbes reflètent les résultats que nous avons pu analyser précédemment sur le temps d’exécution. Encore une fois Smarty 2.6 est en tête avec environ 60 requêtes par secondes. Dwoo le talonne avec environ 40 requêtes par seconde suivi de Smarty 3.0b avec moins de 20 requêtes par seconde.
Lorsque le cache est activé, on obtient des performances satisfaisantes, avec plus de 165 requêtes par seconde pour l’ensemble des concurrents. Smarty 2.6 est encore une fois le meilleur élève avec près de 250 requêtes par seconde. Dwoo et Smarty 3.0 sont à peu près équivalents aux alentours de 180 requêtes par seconde.
En mode « développement » (force check compile), les performances sont satisfaisantes avec environ 130 requêtes par seconde pour Smarty 3.0beta, mais Smarty 2.6 tire son épingle du jeu avec plus de 185 requêtes par secondes. Les résultats sont similaires lors que la vérification de compilation est désactivée. On peut d’ailleur se demander si elle a vraiment un intérêt.

Ces résultats reflètent donc exactement les mesures relevées lors de l’étude des temps d’exécution.

Temps moyen de traitement pour une requête

Time per request
Time per request

Pour finir étudions le temps moyen nécessaire pour servir une requête.
Lorsque le la compilation est forcée, Smarty 2.6 est fidèle à lui même et prend la tête avec environ 80ms, il est suivi par Dwoo avec environ 135ms. Smarty 3.0b est largement à la traine avec plus de 290ms pour servir une requête soit près de 4 fois plus lent que son grand frère.
Lorsque le cache est activé les tendances sont bonnes avec un score inférieur à 30ms pour l’ensemble des concurrents. Smarty 2.6 est toujours en tête avec moins de 21ms pour générer une page, Smarty 3.0b et Dwoo sont à peu près équivalents avec 30ms environ.
Dans la configuration de « développement » avec la vérification de la compilation activé, les performances sont bonnes avec moins de 40ms pour l’ensemble des moteurs testé, Smarty 2.6 est toujours en tête. lorsque la vérification de la compilation est désactivé, les performances restent similaire à la configuration en « développement ».

Pour conclure, Smarty 2.6.26 est actuellement le meilleur moteur de template parmi ceux testés ici. Il est à la fois celui qui consomme le moins de mémoire et le plus rapide, que le cache soit activé ou non. Dwoo est une bonne alternative puisque ses performances talonnent très souvent Smarty 2.6. Smarty 3.0b est assez décevant en terme de consommation de mémoire lors de la compilation, mais mis à part celà, ses performances sont très bonnes et sont proches de celle de Smarty 2.6. N’oublions pas que c’est une version beta et que l’équipe de développement travaille activement, puisque l’on a droit à une nouvelle version beta toutes les trois à quatre semaines environ. Espérons qu’il feront une grosse passe d’optimisation en particulier sur la consommation mémoire. Ce test sera mis à jour au fil des évolutions de ces trois moteurs de template. A ce jour EmisFR continue d’utiliser Smarty 2.6.x en attendant de pouvoir passer sur Smarty 3.0. Dwoo est pour le moment écarté car non compatible avec les logiciels déjà produits, de plus le langage de template est un peu différent et étant donné que ses performances sont moins bonnes que celles de Smarty 2.6.x il présente peu d’intérêt de changer.

Une pensée sur “Performances de Smarty 2.6, 3.0beta et Dwoo”

  1. Bonjour,

    Merci pour ce test de performances, je viens de basculer mon site de smarty2.6 à smarty3.0.6, j’ai également constaté une petite baisse de performance sur les délais d’exécution (environ 25% rien de très grave donc). Mais néanmoins si vous avez l’occasion de tester la version stable de smarty 3 merci de me tenir informé de vos résultats.

Les commentaires sont fermés.