Général

Les PCRE

Les POSIX

Pratique

Linux

Spécial php

Les billets de fred

"echo" : lapin ou tortue ?

Lorsque l'on veut envoyer des données sur le flux de sortie avec PHP et que l'on utilise le mot-clef "echo", plusieurs possibilités s'offrent à nous. Mais quelle forme est la plus performante ?

Quelles sont les différentes formes ?

Il existe en gros 4 formes d'utilisation de "echo" :

   1.

      La forme "brute" :
      <?php
      echo 'la valeur de x est ';
      echo $x;
      ?>
   2.

      La forme "chaîne dynamique" :
      <?php
      echo "la valeur de x est $x";
      ?>
   3.

      La forme "concaténation" (le point) :
      <?php
      echo 'la valeur de x est ' . $x;
      ?>
   4.

      la forme "multi-paramètres" (la virgule) :
      <?php
      echo 'la valeur de x est ', $x;
      ?>

Quelle est la plus performante ?

Certains pourraient être tentés de dire que la forme "chaîne dynamique" est la plus performante, mais ce n'est malheureusement pas le cas.

Observons la décomposition faite par la fonction " token_get_all" sur le code N°2 :

Valeur Type
<?php\n T_OPEN_TAG
echo T_ECHO
  T_WHITESPACE
"  
la T_STRING
  T_ENCAPSED_AND_WHITESPACE
valeur T_STRING
  T_ENCAPSED_AND_WHITESPACE
de T_STRING
  T_ENCAPSED_AND_WHITESPACE
x T_STRING
  T_ENCAPSED_AND_WHITESPACE
est T_STRING
  T_ENCAPSED_AND_WHITESPACE
$x T_VARIABLE
"  
;  
\n T_WHITESPACE
?> T_CLOSE_TAG


Vous remarquez que tous les mots et espaces de la chaîne de caractères sont séparés.

Si nous décomposons maintenant le code N°4 :

 
Valeur Type
<?php\n T_OPEN_TAG
echo T_ECHO
  T_WHITESPACE
'la valeur de x est ' T_CONSTANT_ENCAPSED_STRING
,  
  T_WHITESPACE
$x T_VARIABLE
;  
\n T_WHITESPACE
?> T_CLOSE_TAG


Nous constatons désormais que la chaîne de caractères est entière ce qui conduit PHP à effectuer moins de traitements.

Remarque : L'avantage de la forme N°2 est sa clarté, mais je vous laisse lire l'article "Les chaînes de caractères : soyons cohérents !".

C'est l'une des trois autres, mais laquelle ?

En fait, les formes "brute" et "multi-paramètres" sont sémantiquement identiques, mais le code étant un peu plus long pour la forme "brute", nous pouvons considérer qu'il y a une très légère différence en faveur de la forme "multi-paramètres".

Comparons donc les formes "concaténation" et "multi-paramètres" !

La forme "concaténation" consiste à réserver de l'espace mémoire pour accueillir le résultat de la concaténation avant de l'envoyer sur le flux de sortie alors que la forme "multi-pramètres" envoie chaque chaîne de caractères successivement sur le flux de sortie sans allouer d'espace mémoire inutilement. On pourrait donc s'attendre à ce que la forme "multi-pramètres", en plus de consommer moins de mémoire, soit plus performante, mais ce serait aller bien vite en conclusion.

En effet, un autre phénomène entre en jeu : l'envoi sur le flux de sortie. En réalité, cette opération est gourmande en ressources et de multiples appels engendrent un ralentissement non négligeable. De ce fait, la concaténation consomme plus de mémoire, mais elle est beaucoup plus performante que le multi-paramètres.

Utilisons donc systématiquement la concaténation !

Houlà, doucement, encore une fois n'allons pas trop vite en conclusion.
Pourquoi ? Et bien parce que nous faisons tous une erreur grave depuis le début : enchaîner les "echo" dans nos scripts.
Effectivement, il y a fort à parier que vos scripts ne contiennent pas qu'un seul "echo" et ces appels multiples engendrent le ralentissement dont nous avons parlé précédemment.

Que faudrait-il faire alors ?

La première solution qui viendrait à l'esprit serait de concaténer toutes les chaînes de caractères dans une variable globale que l'on envoie sur le flux de sortie à la fin du script, mais ce n'est pas nécessaire.
En effet, le résultat peut être obtenu de façon identique en utilisant la fonction " ob_start" qui place les données de sortie dans un tampon et les envoie lors de l'appel à " ob_end_flush" ou lorsque le script se termine.
Si vous reprenez vos scripts et que vous ajoutez cette fonction avant le premier "echo", vous allez constater un gain de performance fort appréciable.

Mais dans ce cas, la forme "multi-paramètres" devient plus performante !

C'est exact, et le gain est d'environ 10% par rapport à la version "concaténation".

Pour conclure correctement cette fois-ci, je vous conseille d'utiliser " ob_start" au début de vos scripts et d'utiliser la forme "multi-paramètres" de "echo".

Remarque : Vous pouvez combiner ob_start avec ob_gzhandler afin de faire d'une pierre deux coups : Accélérer le temps de génération et compresser le flux de sortie pour diminuer le temps de chargement de votre page par l'utilisateur.

Par Frédéric Bouchery
ADAM Benjamin 2008 | Admin