Général
- Présentation
- Les Symboles
- Les Métacaractères
- Les Ancres et Classes
- Les options
- Constantes prédéfinies
- Equivalences
- Créer un motif
- Les POSIX
- Les PCRE
- Les Plus des PCRE
- Les Assertions Part I
- Les Assertions Part II
- Motif conditionnel
- Mysql et les regex
- Url Rewriting
- Optimisation
- Aide mémoire
Les PCRE
Les POSIX
Pratique
Spécial php
- Conseils et Astuces
- Délimiteur PCRE
- Créer une bdd
- Utiliser du BBcode
- Le binaire
- Faire un panier
- Cases à cocher
- Citations imbriquées
- Colorateur syntaxique
- Les list-box ou combo-box
- Faire un diaporama
- Isset ou empty ?
- Une légende au survol
- Site en plusieurs langues
- Requêtes dynamiques
- Gestion des smiley
- Faire un moteur de template
- Timestamp php/mysql
- Timestamp mysql
- Matcher une adresse email
- Controler des données
Les billets de fred
- Les POSIX... mise en pratique !
- Limiter l'accès à un répertoire
- Alternance de couleurs
- Magic_quotes
- Désactiver les short_tags
- Require ou include : Bench
- Cohérence dans les chaines de caractères
- "echo" : lapin ou tortue ?
- Gérer un formulaire avec plusieurs boutons
- Le formulaire a t'il été soumis ?
- J'ai décidé de grossir
- La guerre des étoiles
- La guerre des boutons
- Headers already sent
- IP, IP, IP, houra !
- Créer un itérateur avec PHP5
- On vous conduit vers la lumière
- Comment utiliser MySQL avec PHP
- Non aux booléens !
- Php.ini : dist /recommended
- Include : gouffre ou fêlure ?
- Simple comme les sessions !
- Simplifier le traitement des erreurs
- Structurez vos applications
- Franchement, t'es trop for !
- Notice: Undefined variable (ou index)
- Proscrire les variables auto déclarées
"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
