IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

echo d'une concaténation vs echo à plusieurs paramètres


Sujet :

Langage PHP

  1. #1
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut echo d'une concaténation vs echo à plusieurs paramètres
    En PHP la commande echo est une instruction du langage et pas une fonction, et elle permet d'écrire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $name = 'Olivier';
     
    echo 'Bonjour ', $name, '
    ';
     
    ?>
    ce qui donne le même résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $name = 'Olivier';
     
    echo 'Bonjour '.$name.'
    ';
     
    ?>
    J'ai toujours (enfin toujours, mes débuts en PHP date de cet été) privilégié la première manière car elle me semblait plus performante. Mon résonnement était qu'un echo $a.$b.$c.$d; passait par les étapes suivantes :
    1. concaténation de $a et $b
    2. concaténation de ce résultat avec $c
    3. concaténation de ce résultat avec $d
    4. passage de ce résultat à echo qui l'affiche.

    Alors que echo $a, $b, $c, $d; passait tous les paramètres à echo qui avait en charge de faire le boulot. Mais un boulot qui se passe au niveau de l'implémentation de la commande echo et non plus au niveau de l'exécution du code PHP.


    Je me suis décidé à faire un test de vitesse avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?php echo 'Start
    ';
     
    $a = 'un pour commencer';
    $b = 'deux pour poursuivre';
    $c = 'trois plus long pour avoir un peu de texte quand même';
    $d = 'quatre encore un peu';
    $e = 'cinq on finit';
     
    for ($i=0; $i<100000; $i++) {
      echo $a.$i.$b.$i.$c.$i.$d.$i.$e.$i."\n";
    #  echo $a, $i, $b, $i, $c, $i, $d, $i, $e, $i, "\n";
    }
     
    echo 'End
    ';
     
    ?>
    Et à ma plus grande surprise, voici les résultats obtenu sur ma machine :
    ~0.8s pour la version avec les . : concaténation
    ~4.6s pour la version avec les , : plusieurs paramètres

    Pourquoi cette différence en défaveur de ce qui selon moi devrait être le plus rapide ?

    J'ai effectué ce test avec PHP 5.3.1 d'une installation XAMPP, sous Windows 7.

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    9a peut peut être s'expliquer parce que le nombre de paramètre à passer peut être variable.

    Du coup echo est obligé de compter le nombre de paramètre à concaténer et de boucler dessus.
    Alors que dans l'autre cas, il n'y a pas à faire ce travail.

    Et que dans tous les cas, je vois pas pourquoi une concaténation faite dans echo ou en dehors serait moins gourmande.

  3. #3
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    Le nombre de paramètres est déterminé à la compilation. Et il n'y a aucune nécessité de les concaténer.

    echo avec plusieurs paramètres doit les afficher tous. Si le plus performant est de les concaténer qu'il le fasse, sinon qu'il se débrouille comme il veut mais qu'il le fasse bien.

    Je ne sais pas comment être clair, mais il me semble que les deux alternatives se jouent à des niveaux différents, et que c'est la bonne manière de faire qui est mauvaise car php est mal implémenté

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    De vieux benchs (je sais plus sur quel site) avaient mis en valeur que le echo multiparametres était plus performant.
    C'était il y a longtemps. Vu que la plupart des gens utilisent systématiquement la concaténation, des efforts on dû être faits dans ce sens.
    A la limite c'est de l'optimisation de quart de poil. Dans un usage normal la différence entre les deux est anecdotique.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    test 1 : echo 'foo', 'bar'
    test 2 : echo 'foo' . 'bar'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    number of ops:  3
    compiled vars:  none
    line     # *  op                 fetch          ext  return  operands
    -----------------------------------------------------------------------
       1     0  >   ECHO                                           'foo'
             1      ECHO                                           'bar'
             2    > RETURN                                         1
     
     
    number of ops:  3
    compiled vars:  none
    line     # *  op                 fetch          ext  return  operands
    -----------------------------------------------------------------------
       1     0  >   CONCAT                                 ~0      'foo', 'bar'
             1      ECHO                                           ~0
             2    > RETURN                                         1
    sachant qu'un CONCAT prend toujours 2 paramètres

  6. #6
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    stealth35 tu peux expliquer stp ?

    Le truc c'est que je me dis que si une optimisation est faite sur les concaténations, elle devrait être faite aussi sur l'exécution de l'echo avec les multiples paramètres. Et théoriquement je m'attends à ce que cet echo multiple soit au moins aussi rapide que la concaténation...

    Y a-t-il une spécification qui détermine un "comportement fin" de ces deux syntaxe ?

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    les 2 façons font 3 opérations chaque une

    et finalement faire :
    echo 'foo', 'bar';

    reviens a faire
    echo 'foo';
    echo 'bar';

    et si tu dis que c'est plus long c'est que peu être que le concat est plus rapide que le echo ce qui semble logique puisqu'il faut plus d'opération pour envoyer une chaine dans le php://output que d'ajouter 2 variables

    faudrait avoir le detail en asm de ZEND_CONCAT et de ZEND_ECHO

    Y a-t-il une spécification qui détermine un "comportement fin" de ces deux syntaxe ?
    en CLI ca retourne 1 par défaut pour ton return_var

  8. #8
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    Citation Envoyé par stealth35
    et finalement faire :
    echo 'foo', 'bar';

    reviens a faire
    echo 'foo';
    echo 'bar';
    Fonctionnellement oui.
    Alors je ne connais rien du "langage machine" PHP, mais il y a un niveau en dessous du langage qui fait que echo 'foo', 'bar'; ne soit pas deux echo successifs. Si il n'y a pas une "instruction machine" echo qui accepte plusieurs paramètres, elle peut-être implémentée à ce niveau.

    Alors que les concaténations imbriquées (qui syntaxiquement sont faites deux par deux) peuvent être optimisées pour se réduire au mieux de la même façon que le echo avec plusieurs paramètres. Mais au final le echo avec les , ne devrait pas être plus lent que le echo avec les .

    Suis pas sûr d'être clair là

    Je m'en vais regarder The Mentalist, lui demanderai entre deux énigmes.

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    pense juste que c'est plus facile de mettre deux lettres dans un courrier, que de mettre 1 lettre par courrier, parce que le fait d'acheminer le courrier (1 voyage par courrier) c'est plus long que de mettre une lettre dans une enveloppe

  10. #10
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 421
    Par défaut
    Un rapport de 1 à plus de 5 me paraît vraiment beaucoup (trop).
    Sur moins d'itération (genre 10000) tu obtiens la même différence ?

    Il y a longtemps j'avais entendu dire que la concaténation était légèrement moins rapide mais de peu et que de toutes façons ce n'était pas à ce niveau là qu'on optimisait un script.

    Que des efforts aient été fait pour la concaténation, c'est possible, mais qu'on en arrive à des résultats plus de cinq fois plus rapide, ça me laisse perplexe.

    Cela dit "comme tout le monde" je fais des concaténations donc si ça se confirme, c'est tant mieux

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Citation Envoyé par ABCIWEB Voir le message
    Cela dit "comme tout le monde" je fais des concaténations donc si ça se confirme, c'est tant mieux
    Moi aussi.

    Cela dit, j'ai testé avec la moulinette ci-dessous. Il en ressort chez moi que la concaténation est plus lente que le passage de paramètres, mais que plus il y a d'itérations, plus l'écart se resserre. Il faut malgré tout relativiser les choses car les écarts se calculent en millièmes de secondes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?php
      function temps()
      {
        $result = explode(' ', microtime());
        $temps = $result[1] + $result[0];
        return $temps;
      }
     
      //----------------------------------------------------------------------------
      //----------------------------------------------------------------------------
      //----------------------------------------------------------------------------
      $max = 1000;
     
      $a = 'un pour commencer ';
      $b = 'deux pour poursuivre ';
      $c = 'trois plus long pour avoir un peu de texte quand même ';
      $d = 'quatre encore un peu ';
      $e = 'cinq on finit ';
     
      ob_start();
      $deb = temps();
      for($i = 0; $i < $max; $i ++)
      {
        echo $a . $b . $c . $d . $e . '<br />';
      }
      $fin = temps();
      ob_end_clean();
     
      $ecartConcat = $fin - $deb;
     
      ob_start();
      $deb = temps();
      for($i = 0; $i < $max; $i ++)
      {
        echo $a, $b, $c, $d, $e . '<br />';
      }
      $fin = temps();
      ob_end_clean();
     
      $ecartParam = $fin - $deb;
      $diffrencePourCent = ($ecartParam - $ecartConcat) / ($ecartConcat / 100);
     
      echo 'concaténation => ' . $ecartConcat . '<br />';
      echo 'paramètres => ' . $ecartParam . '<br />';
      echo '% différence => ' . $diffrencePourCent . ' %<br />';
    ?>

  12. #12
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par jeca Voir le message
    Bonjour,


    Moi aussi.

    Cela dit, j'ai testé avec la moulinette ci-dessous. Il en ressort chez moi que la concaténation est plus lente que le passage de paramètres, mais que plus il y a d'itérations, plus l'écart se resserre. Il faut malgré tout relativiser les choses car les écarts se calculent en millièmes de secondes.
    pareil je gagne 25% de mon coté

  13. #13
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    jeca, il faut plus d'itérations pour mettre en évidence les différences que l'on veut mesurer.
    J'ajoutais des $i pour ne pas faire tout le travail que sur des éléments constants.
    Et puis je faisais le test dans la console, avec la commande Unix time.

    Un récapitulatif des résultats, obtenus avec ce que contient le fichier echo_concat_vs_params.tar attaché à ce message.
    En gros les lignes suivantes ajoutées, une par une, dans ma "moulinette" ci-dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    echo "$i\n";
     
    echo $i."\n";
    echo $i, "\n";
     
     
    echo "$a$b$c$d$e\n";
    echo $a.$b.$c.$d.$e."\n";
    echo (((($a.$b).$c).$d).$e)."\n";
    echo $a, $b, $c, $d, $e, "\n";
     
     
    echo "$a$i$b$i$c$i$d$i$e$i\n";
    echo $a.$i.$b.$i.$c.$i.$d.$i.$e.$i."\n";
    echo (((((((($a.$i).$b).$i).$c).$i).$d).$i).$e).$i."\n";
    echo $a, $i, $b, $i, $c, $i, $d, $i, $e, $i, "\n";
    Fichiers attachés Fichiers attachés

  14. #14
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    Citation Envoyé par OPi Voir le message
    jeca, il faut plus d'itérations pour mettre en évidence les différences que l'on veut mesurer.
    J'ai testé avec 1000, 10000 et 100000 itérations.

  15. #15
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut
    Je viens de visionner cette vidéo [ame="http://www.dailymotion.com/video/xizuf6_optimisation-des-sites-internet-html-php-kiwi-party-2011_tech"]Dailymotion - Optimisation des sites internet HTML / PHP (Kiwi Party 2011) - une vidéo High-tech et Science@@AMEPARAM@@http://www.dailymotion.com/swf/video/xizuf6@@AMEPARAM@@xizuf6[/ame] de la Kiwi Party 2011. Vers la 56e minute (correspondant au 32e [ame="http://www.slideshare.net/devclic/kiwiparty-2011-optimisation-des-sites-internet"]Kiwiparty 2011 - Optimisation des sites internet@@AMEPARAM@@ssplayer2.swf?doc=kiwiparty2011-optimisationdessitesinternet-110404104038-phpapp02&amp;stripped_title=kiwiparty-2011-optimisation-des-sites-internet@@AMEPARAM@@kiwiparty2011-optimisationdessitesinternet-110404104038-phpapp02@@AMEPARAM@@kiwiparty-2011-optimisation-des-sites-internet[/ame]) il est précisé qu'un echo avec plusieurs paramètres séparés par des virgules est plus rapides qu'un echo avec un seul paramètre résultant de la concaténation de plusieurs éléments...

  16. #16
    OPi
    OPi est déconnecté
    Membre très actif
    Avatar de OPi
    Homme Profil pro
    en recherche d'emploi
    Inscrit en
    Août 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : en recherche d'emploi
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 74
    Par défaut Mise à jour
    Mise à jour de time_average.py, le petit programme utilisé ci-dessus, et un nouveau lien (mon site Internet a été déplacé) vers le récapitulatif.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/11/2014, 16h19
  2. Réponses: 15
    Dernier message: 03/08/2011, 19h43
  3. Réponses: 2
    Dernier message: 19/03/2009, 10h33
  4. Comment retourner plusieurs paramétre d'une procedure stockée?
    Par nic413 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 24/06/2006, 18h30
  5. Réponses: 3
    Dernier message: 25/04/2006, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo