Archives par étiquette : echo

PHP: echo vs print

Ces derniers temps en me baladant nonchalamment sur le Web, j’ai eu l’occasion de voir à de nombreuses reprises des « matches » entre echo et print, certains soutenant (fort heureusement, avec leurs benchmarks à l’appui) qu’echo était plus rapide que print. Nous allons voir ce qu’il en est de notre côté !

Echo et print

Echo n’est pas une fonction ! C’est officiellement une « structure du langage » (language construct) PHP.

Echo, lorsqu’on l’utilise avec des parenthèses, ne prend qu’un seul paramètre :

$prenom = 'Sebastien';
// avec des parenthèses
echo ("Bonjour, " . $prenom);

Notre unique paramètre ici est le résultat de la concaténation de la chaîne de caractères « Bonjour,  » avec la variable $prenom qui contient la valeur Sebastien.

Les virgules nous permettent également le passage de plusieurs paramètres à echo :

$prenom = 'Sebastien';
echo 'Bonjour, ', $prenom, ' !';

Faisons un savant mélange de tout ça :

$prenom = 'Sebastien';
echo "Salut, " . ($prenom . " Ferrandez"), ", ça va ?";

Print n’est pas non plus une fonction, et ce même si print retourne une valeur entière (constante, toujours égale à 1). Print est une aussi construction du langage plus proche de la fonction qu’echo puisqu’elle renvoie une valeur mais la comparaison s’arrête là.

C’est parfaitement inutile, mais de fait rien ne vous interdit de faire le branchement conditionnel suivant :

$prenom = 'Sebastien';
if (1 === print("Bonjour")) {
    echo ",$prenom";
}

ou bien, puisque print renvoie 1 et que 1 == true avec l’égalité dite classique :

$prenom = 'Sebastien';
if (print("Bonjour")) {
    echo ",$prenom";
}

Elephant-PHP

Un benchmark maison

Pour valider la prévalence de l’un de ces language constructs sur l’autre, rien ne vaut un test ! Je suis horripilé par les gens qui propagent des légendes urbaines du développement sans apporter la preuve de ce qu’ils répètent bêtement (« telle fonction est plus rapide que telle autre », « telle chose c’est le Mal ! », « telle autre chose n’est pas optimisée ») !

Voici le programme trivial qui nous sert pour nos tests :

$time_start = microtime(true);

for ($i=0; $i<10000; $i++) {
   print "test";
}

$time_end = microtime(true);
$time = $time_end - $time_start;

echo PHP_EOL . "$time secondes\n";

Evidemment, pour tester echo, vous prendrez soin de remplacer l’appel à print par echo !
Voici la version de php CLI que j’ai utilisé pour mener ces petites investigations sous GNU/Linux Debian sid :

PHP 5.4.4-14 (cli) (built: Mar  4 2013 14:08:43) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

L’idée ici était de faire des boucles avec un nombre d’itérations décuplé. Voici les résultats de ces expérimentations :

100 impressions du mot test :
echo : 0.00029110908508301 secondes
print : 0.00029802322387695 secondes

1000 impressions du mot test :
echo : 0.0025129318237305 secondes
print : 0.0025389194488525 secondes

10000 impressions du mot test :
echo : 0.025437831878662 secondes
print : 0.027919054031372 secondes

100000 impressions du mot test :
echo : 0.30710697174072 secondes
print : 0.23741006851196 secondes

1 million d’impressions du mot test :
echo : 2.6142749786377 secondes
print : 2.5098519325256 secondes

10 millions d’impressions du mot test :
echo : 27.915874958038 secondes
print : 33.695736885071 secondes (quasiment 5 secondes de plus !)

Ces valeurs sont des valeurs moyennes, calculées sur l’ensemble des 5 tests lancés dans chacun des cas et pour chaque language construct. Ce qu’on peut observer à la lumière de ces tests empiriques c’est qu’effectivement, echo est plus rapide en terme de temps d’exécution que print. Cependant, la tendance s’inverse dans certains cas, notamment ici lorsque le nombre d’itérations croît pour atteindre un million d’itérations. La tendance initiale se retrouve sur des nombres très élevés d’itérations (ici, 10 millions).

En conclusion

Nous avons pu vérifier avec quelques exemples concrets que oui, echo est plus rapide que print. Evidemment, nous le voyons d’autant plus que nous poussons ces deux language constructs dans leurs derniers retranchements, avec un nombre d’itérations épouvantable (qui fait ça en pratique, hein ?).

J’ai tendance à penser que lorsqu’on en est arrivé à tenter de gagner des millisecondes sur un appel à une fonction ou un language construct PHP, c’est qu’on n’a plus rien à faire au niveau de la qualité du code produit et malheureusement, l’expérience m’a souvent montré qu’avant de s’attacher à optimiser des appels comme ceux-ci, les développeurs feraient mieux de s’attacher à produire du code de qualité (conforme aux principes SOLID, par exemple) !

Quelques liens

Documentation PHP : echo
PHP Benchmark http://www.phpbench.com/ [anglais]