Bench PHP en dessert

Puisque cela faisait longtemps...

Php et Echo

Il est plus performant d'écrire :

echo '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="description" content="';
echo $meta_description;
echo '" />
<meta name="keywords" content="';
echo $meta_keywords;
echo '" />
<link rel="alternate" type="application/rss+xml" title="';
echo $rss_title;
echo ' RSS" href="rss.php" />
<link rel="alternate" type="application/rss+xml" title="';
echo $rss_title;
echo ' RSS 2.0" href="rss2.php" />
<link rel="shortcut icon" type="images/x-icon" href="favicon.ico" />
<meta name="DC.title" content="';
echo $title;
echo '" /></head>';

... que d'écrire :

echo '<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<meta name="description" content="'.$meta_description.'" />
<meta name="keywords" content="'.$meta_keywords.'" />
<link rel="alternate" type="application/rss+xml" title="'.$title.' RSS" href="rss.php" />
<link rel="alternate" type="application/rss+xml" title="'.$title.' RSS 2.0" href="rss2.php" />
<link rel="shortcut icon" type="images/x-icon" href="favicon.ico" />
<meta name="DC.title" content="'.$title.'" /></head>';

Ceci provient de la concaténation préalable de la chaîne de caractères à afficher. On pourrait préjuger qu'une somme d'instructions multiples (echo ici même) nuirait aux performances. Or la première solution s'en sort un peu mieux. Moralité, si vous avez de longues chaînes aux pieds, allez-y petit à petit, au lieu de tout concaténer. Bien sûr il s'agit là encore d'une optimisation au niveau atomique, il y a bien d'autres façons de miner un script au C4.

29 commentaires pour “Bench PHP en dessert”

  1. yöm dit :

    Je ne comprends pas : une page avec un seul "echo" met 0.082ms à charger (c’est bien ça ?) et des "echo" multiples, 0.097, pourtant tu recommandes cette solution ?

  2. Benoit F. dit :

    Semblerai qu’il y ai comme un problème soit dans l’explication ou dans l’image.

    Autre piste de recherche, que donne un echo simple mais avec les différentes chaines séparées par des virgules :
    echo "truc", $machin, "chose", $bidule;

  3. Spartakis dit :

    Et pour aller encore plus loin que le niveau atomique, voici un petit comparatif qu’on m’a fait découvrir dans le cadre d’un projet en équipe.
    phpdebutant.org/article14…

    Alala optimisation quant tu nous tiens ;-)

  4. alvas dit :

    inversion en effet :o

    en fait dew était en train d’encoder le dernier épisode de friends quand il a lancé le test avec les echo multiples, donc vive la fiabilité :/

  5. pr4y dit :

    il etait en train de DL de la jeune chinoise oué

  6. dew dit :

    C’est toi le chinois, pas moi. Image corrigée les intitulés étaient inversés.

  7. papillon41 dit :

    Bravo Dew, tu as gagné 15ms, que vas tu faire de tout ce temps ?

  8. alvas dit :

    branlette de webmaster ;) (je cautionne ceci étant)

  9. NeqO dit :

    Effectivement il faudrait utiliser la virgule et pas le point lors d’un echo, ça àvite la concaténation.

    Si un autre bench interressant.
    http://www.blueshoes.org/phpBenc...

  10. Florian dit :

    Le mieux est encore de séparer le code php du code html :

    <?php
    $nom = "Dews Blog";
    ?>
    Bienvenue sur <?php echo "$nom"; ?> !

  11. Glide dit :

    Exact, ce qui donne:

    <?xml version="1.0" encoding="iso-8859-1"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
    <html lang="fr">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
    <meta name="description" content="<?php echo($meta_description) ?>" />
    <meta name="keywords" content="<?php echo($meta_keywords) ?>" />
    <link rel="alternate" type="application/rss+xml" title="<?php echo($title) ?> RSS" href="rss.php" />
    <link rel="alternate" type="application/rss+xml" title="<?php echo($title) ?> RSS 2.0" href="rss2.php" />
    <link rel="shortcut icon" type="images/x-icon" href="favicon.ico" />
    <meta name="DC.title" content="<?php echo($title) ?>" /></head>

    Ce qui est d’ailleur aussi plus facile à interpreter pour la colorisation syntaxique

  12. dew dit :

    Tout dépend du script en général. Le parseur PHP se comporte de toute façon différemment selon l’architecture du script. C’est pourquoi j’ai mis le code complet pour citer un *cas précis*. Il y a évidemment cent autres manières de faire.
    papillon41 > Lorsqu’il s’agit d’un script lancé plus d’un million de fois par an, ça soulage un peu le serveur. Autant prendre de bonnes habitudes dès le départ :)

  13. Matt.Rixx dit :

    Sauf que la, en l’occurence, le "<?xml…." peut poser des problèmes sur certains serveurs, il est donc nécessaire de passer par un echo ‘<?xml…’; au moins pour cette ligne

  14. Enisséo dit :

    As-tu déjà benchmarké la différence entre :
    <?php foreach (): ?> CODE HTML <?php endforeach; ?>
    et
    <?php foreach (){ ?> CODE HTML <?php } ?> ?

    (ou même avec des if…)

  15. Gru dit :

    Euh, c’est vraiment 0.097ms et 0.082ms?
    C’est pas plutôt des 0.097s et 0.082s (équivalent à 97ms et 82ms)…

    en tout cas si c’est vraiment des millièmes de milliseconde, c’est rapide :)

    Et juste une question, si j’ai bien suivi, on aggne 15ms à écrire un code avec plus de choses dedans, mais ces 15ms valent-elles le coup d’avoir un code plus gros et un peu bizarre à lire?

    (question vraiment ouverte hein, pure coriosité)

  16. papillon41 dit :

    Dew > C’est seulement une blague que l’on m’a faite et dont je voulais me débarrasser. Si non, bien sur, toute les façons d’améliorer un script sons bonnes à prendre !

  17. pokute dit :

    Quoi qu’il arrive, une bufferisation annule _théoriquement_ toute différence… Bizarre ce résultat n’empèche.

    uk2.php.net/manual/en/fun…

  18. bohwaz dit :

    Perso je préfère quand même avoir un code un tant soit peu lisible et modifiable. Parce que les echo multiples ça fait un peu bouillabaisse de code c’est pas du plus maintenable à mon sens…

    Même si pour des applis à haute charge le gain est réellement intéressant, en dehors de ces cas-là je préfère un seul echo.

  19. Bertrand dit :

    bohwaz> Ce qui serait envisageable, c’est un script qui convertit ton fichier php peu optimisé mais bien lisible en un fichier php optimisé mais peu lisible… Une sorte de compilation …
    Un automate saurait facilement faire quelques traitements du genres, pour quelques astuces.

  20. Mobman02 dit :

    ça faisait longtemps qu’on avait pas eu un billet sur PHP, merci ;)
    Ceci dit, c’est encore une question de clarté et d’habitude pour le programmeur, c’est pas facile de changer ses habitudes pour optimiser un code,
    c’est donc plutôt dans les cours de prog qu’il faudrais essayer de bonnes techniques, dès le départs.

  21. Paulioman dit :

    C’est moi ou c’est en contradiction avec un précédent bench (certe le test était fait sans concaténation).
    http://www.estvideo.com/dew/page...

  22. Yazerty dit :

    J’aime bien ces petites explications. Ca peut être utile et c’est toujours intéressant à voir et savoir. Même si un seul echo est souvent plus facile à lire, surtout si on part dans des if() elseif() ou ce genre de choses…

    Merci Dew :).

  23. dew dit :

    Paulioman > c’était fait sans concaténation, l’autre bench reste valable :)
    Gru > oui c’est 0.097ms et 0.082ms, le temps moyen (plusieurs tests effectués) pour exécuter l’instruction (sur ma configuration) et non le script complet, ce qui fausserait le calcul.

  24. Eric Daspet dit :

    Tout ça dépend.
    Ca dépend si tu bufferises ta sortie ou pas (sans buffer ton premier code fait beaucoup de "echo" donc beaucoup d’appel systèmes). Ca dépend aussi de l’éventuelle présence d’un cache d’opcode avec optimiseur (type ce que fait Zend). Ca dépend aussi de la charge de ta machine, Ca dépend aussi ….
    … malheureusement bien des gens testent ce genre de performances et chacun obtient des résultats différents.

    Bref, ne pas se focaliser la dessus. D’autant moins que la différence de perf est vraiment négligeable en général. (ici la différence me semble énorme par rapport à ce qu’on voit ailleurs, j’aimerai bien connaitre ta méthodologie de test, à mon avis il y a un problème de ce coté)

    Dans tous les cas, AMHA, c’est bien plus la lisibilité du code et la facilité d’y faire des erreurs qui priment sur quelques millisecondes.

  25. dew dit :

    Bien sûr que ça dépend :) Il n’y a ni buffer ni cache, comme dit : c’est un *cas précis* qui ne vaut pas parole d’évangile. Et à priori la charge (nulle) de la machine n’inverse pas les résultats sur plusieurs dizaines de tests.
    C’est à chacun de savoir si on doit privilégier la lisibilité ou "le reste"… Après, quand on doit vraiment faire de l’optimisation, il est toujours intéressant de se poser la question. Lorsqu’on arrive à diviser par 2 ou 3 le temps d’exécution total (pas avec cette méthode bien sûr), ça reste appréciable pour servir 2 à 3 fois plus de pages.

  26. Gru dit :

    waah, même si c’est des petites instructions de rien du tout, c’est quand même des millionièmes de secondes.. L’informatique ne cessera jamais de m’étonner… :D

  27. alvas dit :

    J’ai testé sur les serveurs d’apinc, d’estvideo et sur le mien, je n’arrive statistiquement jamais à presque 20% d’écart entre les 2 variantes. Au mieux, j’ai une différence de 1% en faveur de la première méthode.
    J’ai procédé de diverses manières : moyennes empiriques d’une dizaine de tests sur des boucles de 10, 100 et 1000 itérations.

  28. dew dit :

    Tant mieux tu n’as pas à choisir.

  29. Tétard'o dit :

    Salut à tous,
    encore plus rapide et plus lisible :

    <meta name="description" content="<?php echo($meta_description) ?>" />

    <meta name="description" content="<?=$meta_description?>" />

    Vola :p

Laisser un commentaire