{"id":519,"date":"2013-05-29T15:07:07","date_gmt":"2013-05-29T13:07:07","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=519"},"modified":"2013-05-29T15:22:33","modified_gmt":"2013-05-29T13:22:33","slug":"php-echo-vs-print","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/","title":{"rendered":"PHP: echo vs print"},"content":{"rendered":"<p>Ces derniers temps en me\u00a0baladant\u00a0nonchalamment sur le Web, j&rsquo;ai eu l&rsquo;occasion de voir \u00e0 de nombreuses reprises des \u00ab\u00a0matches\u00a0\u00bb entre <strong>echo<\/strong> et <strong>print<\/strong>, certains soutenant (fort heureusement, avec <em>leurs<\/em> benchmarks \u00e0 l&rsquo;appui) qu&rsquo;<em>echo<\/em> \u00e9tait plus rapide que <em>print<\/em>. Nous allons voir ce qu&rsquo;il en est de notre c\u00f4t\u00e9 !<\/p>\n<h1>Echo et print<\/h1>\n<p><strong>Echo n&rsquo;est pas une fonction<\/strong> ! C&rsquo;est officiellement une \u00ab\u00a0structure du langage\u00a0\u00bb (<em>language construct<\/em>) PHP.<\/p>\n<p>Echo, lorsqu&rsquo;on l&rsquo;utilise avec des parenth\u00e8ses, ne prend qu&rsquo;un seul param\u00e8tre :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$prenom = 'Sebastien';\r\n\/\/ avec des parenth\u00e8ses\r\necho (&quot;Bonjour, &quot; . $prenom);\r\n<\/pre>\n<p>Notre unique param\u00e8tre ici est le r\u00e9sultat de la concat\u00e9nation de la cha\u00eene de caract\u00e8res \u00ab\u00a0Bonjour, \u00a0\u00bb avec la variable $prenom qui contient la valeur Sebastien.<\/p>\n<p>Les virgules nous permettent \u00e9galement le passage de plusieurs param\u00e8tres \u00e0 echo :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$prenom = 'Sebastien';\r\necho 'Bonjour, ', $prenom, ' !';\r\n<\/pre>\n<p>Faisons un savant m\u00e9lange de tout \u00e7a :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$prenom = 'Sebastien';\r\necho &quot;Salut, &quot; . ($prenom . &quot; Ferrandez&quot;), &quot;, \u00e7a va ?&quot;;\r\n<\/pre>\n<p><strong>Print n&rsquo;est pas non plus une fonction<\/strong>, et ce m\u00eame si print retourne une valeur enti\u00e8re (constante, toujours \u00e9gale \u00e0 1). Print est une aussi construction du langage plus proche de la fonction qu&rsquo;echo puisqu&rsquo;elle renvoie une valeur mais la comparaison s&rsquo;arr\u00eate l\u00e0.<\/p>\n<p>C&rsquo;est parfaitement inutile, mais de fait rien ne vous interdit de faire le branchement conditionnel suivant :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$prenom = 'Sebastien';\r\nif (1 === print(&quot;Bonjour&quot;)) {\r\n    echo &quot;,$prenom&quot;;\r\n}\r\n<\/pre>\n<p>ou bien, puisque <strong>print<\/strong> renvoie 1 et que <strong>1 == true<\/strong> avec l&rsquo;\u00e9galit\u00e9 dite classique :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$prenom = 'Sebastien';\r\nif (print(&quot;Bonjour&quot;)) {\r\n    echo &quot;,$prenom&quot;;\r\n}\r\n<\/pre>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP.png\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP.png\" alt=\"Elephant-PHP\" width=\"327\" height=\"248\" class=\"alignnone size-full wp-image-544\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP.png 327w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP-300x227.png 300w\" sizes=\"(max-width: 327px) 100vw, 327px\" \/><\/a><\/p>\n<h1>Un <em>benchmark<\/em> maison<\/h1>\n<p>Pour valider la pr\u00e9valence de l&rsquo;un de ces <em>language constructs<\/em> sur l&rsquo;autre, rien ne vaut un test ! Je suis horripil\u00e9 par les gens qui propagent des l\u00e9gendes urbaines du d\u00e9veloppement sans apporter la preuve de ce qu&rsquo;ils r\u00e9p\u00e8tent b\u00eatement (\u00ab\u00a0telle fonction est plus rapide que telle autre\u00a0\u00bb, \u00ab\u00a0telle chose c&rsquo;est le Mal !\u00a0\u00bb, \u00ab\u00a0telle autre chose n&rsquo;est pas optimis\u00e9e\u00a0\u00bb) !<\/p>\n<p>Voici le programme trivial qui nous sert pour nos tests :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n$time_start = microtime(true);\r\n\r\nfor ($i=0; $i&lt;10000; $i++) {\r\n   print &quot;test&quot;;\r\n}\r\n\r\n$time_end = microtime(true);\r\n$time = $time_end - $time_start;\r\n\r\necho PHP_EOL . &quot;$time secondes\\n&quot;;\r\n<\/pre>\n<p>Evidemment, pour tester echo, vous prendrez soin de remplacer l&rsquo;appel \u00e0 print par echo !<br \/>\nVoici la version de php CLI que j&rsquo;ai utilis\u00e9 pour mener ces petites investigations sous GNU\/Linux Debian sid : <\/p>\n<pre>\r\nPHP 5.4.4-14 (cli) (built: Mar  4 2013 14:08:43) \r\nCopyright (c) 1997-2012 The PHP Group\r\nZend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies\r\n<\/pre>\n<p>L&rsquo;id\u00e9e ici \u00e9tait de faire des boucles avec un nombre d&rsquo;it\u00e9rations d\u00e9cupl\u00e9. Voici les r\u00e9sultats de ces exp\u00e9rimentations :<\/p>\n<p><strong>100 impressions du mot test :<\/strong><br \/>\necho : 0.00029110908508301 secondes<br \/>\nprint : 0.00029802322387695 secondes<\/p>\n<p><strong>1000 impressions du mot test :<\/strong><br \/>\necho : 0.0025129318237305 secondes<br \/>\nprint : 0.0025389194488525 secondes<\/p>\n<p><strong>10000 impressions du mot test :<\/strong><br \/>\necho : 0.025437831878662 secondes<br \/>\nprint : 0.027919054031372 secondes<\/p>\n<p><strong>100000 impressions du mot test :<\/strong><br \/>\necho : 0.30710697174072 secondes<br \/>\nprint : 0.23741006851196 secondes<\/p>\n<p><strong>1 million d&rsquo;impressions du mot test :<\/strong><br \/>\necho : 2.6142749786377 secondes<br \/>\nprint : 2.5098519325256 secondes<\/p>\n<p><strong>10 millions d&rsquo;impressions du mot test :<\/strong><br \/>\necho : 27.915874958038 secondes<br \/>\nprint : 33.695736885071 secondes (quasiment 5 secondes de plus !)<\/p>\n<p>Ces valeurs sont des valeurs moyennes, calcul\u00e9es sur l&rsquo;ensemble des 5 tests lanc\u00e9s dans chacun des cas et pour chaque <em>language construct<\/em>. Ce qu&rsquo;on peut observer \u00e0 la lumi\u00e8re de ces tests empiriques c&rsquo;est qu&rsquo;effectivement, <em>echo<\/em> est plus rapide en terme de temps d&rsquo;ex\u00e9cution que <em>print<\/em>. Cependant, la tendance s&rsquo;inverse dans certains cas, notamment ici lorsque le nombre d&rsquo;it\u00e9rations cro\u00eet pour atteindre un million d&rsquo;it\u00e9rations. La tendance initiale se retrouve sur des nombres tr\u00e8s \u00e9lev\u00e9s d&rsquo;it\u00e9rations (ici, 10 millions).<\/p>\n<h1>En conclusion<\/h1>\n<p>Nous avons pu v\u00e9rifier avec quelques exemples concrets que oui, <strong>echo<\/strong> est plus rapide que <strong>print<\/strong>. Evidemment, nous le voyons d&rsquo;autant plus que nous poussons ces deux <em>language constructs<\/em> dans leurs derniers retranchements, avec un nombre d&rsquo;it\u00e9rations \u00e9pouvantable (qui fait \u00e7a en pratique, hein ?).<\/p>\n<p>J&rsquo;ai tendance \u00e0 penser que lorsqu&rsquo;on en est arriv\u00e9 \u00e0 tenter de gagner des millisecondes sur un appel \u00e0 une fonction ou un <em>language construct<\/em> PHP, c&rsquo;est qu&rsquo;on n&rsquo;a plus rien \u00e0 faire au niveau de la qualit\u00e9 du code produit et malheureusement, l&rsquo;exp\u00e9rience m&rsquo;a souvent montr\u00e9 qu&rsquo;avant de s&rsquo;attacher \u00e0 optimiser des appels comme ceux-ci, les d\u00e9veloppeurs feraient mieux de s&rsquo;attacher \u00e0 produire du code de qualit\u00e9 (conforme aux <a href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/04\/les-principes-solid-expliquees-a-ma-fille\/\" title=\"Les principes SOLID expliqu\u00e9es \u00e0 ma fille\">principes SOLID<\/a>, par exemple) ! <\/p>\n<h1>Quelques liens<\/h1>\n<p>Documentation PHP : <a href=\"http:\/\/fr2.php.net\/manual\/fr\/function.echo.php\">echo<\/a><br \/>\nPHP Benchmark <a href=\"http:\/\/www.phpbench.com\/\" target=\"_blank\">http:\/\/www.phpbench.com\/<\/a> [anglais]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ces derniers temps en me\u00a0baladant\u00a0nonchalamment sur le Web, j&rsquo;ai eu l&rsquo;occasion de voir \u00e0 de nombreuses reprises des \u00ab\u00a0matches\u00a0\u00bb entre echo et print, certains soutenant (fort heureusement, avec leurs benchmarks \u00e0 l&rsquo;appui) qu&rsquo;echo \u00e9tait plus rapide que print. Nous allons voir ce qu&rsquo;il en est de notre c\u00f4t\u00e9 ! Echo et print Echo n&rsquo;est pas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[3],"tags":[54,55],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP: echo vs print - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP: echo vs print - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Ces derniers temps en me\u00a0baladant\u00a0nonchalamment sur le Web, j&rsquo;ai eu l&rsquo;occasion de voir \u00e0 de nombreuses reprises des \u00ab\u00a0matches\u00a0\u00bb entre echo et print, certains soutenant (fort heureusement, avec leurs benchmarks \u00e0 l&rsquo;appui) qu&rsquo;echo \u00e9tait plus rapide que print. Nous allons voir ce qu&rsquo;il en est de notre c\u00f4t\u00e9 ! Echo et print Echo n&rsquo;est pas [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2013-05-29T13:07:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-29T13:22:33+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP.png\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/\",\"name\":\"PHP: echo vs print - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2013-05-29T13:07:07+00:00\",\"dateModified\":\"2013-05-29T13:22:33+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP: echo vs print\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP: echo vs print - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP: echo vs print - La Fabrique de code - Tech blog","og_description":"Ces derniers temps en me\u00a0baladant\u00a0nonchalamment sur le Web, j&rsquo;ai eu l&rsquo;occasion de voir \u00e0 de nombreuses reprises des \u00ab\u00a0matches\u00a0\u00bb entre echo et print, certains soutenant (fort heureusement, avec leurs benchmarks \u00e0 l&rsquo;appui) qu&rsquo;echo \u00e9tait plus rapide que print. Nous allons voir ce qu&rsquo;il en est de notre c\u00f4t\u00e9 ! Echo et print Echo n&rsquo;est pas [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2013-05-29T13:07:07+00:00","article_modified_time":"2013-05-29T13:22:33+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2013\/05\/Elephant-PHP.png"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/","name":"PHP: echo vs print - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2013-05-29T13:07:07+00:00","dateModified":"2013-05-29T13:22:33+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2013\/05\/php-echo-vs-print\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP: echo vs print"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/519"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=519"}],"version-history":[{"count":28,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/519\/revisions"}],"predecessor-version":[{"id":547,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/519\/revisions\/547"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=519"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}