Bench PHP en dessert
Puisque cela faisait longtemps...

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.
9 février 2006 à 00:22
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 ?
9 février 2006 à 00:29
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;
9 février 2006 à 00:32
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 ;-)
9 février 2006 à 00:47
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é :/
9 février 2006 à 01:00
il etait en train de DL de la jeune chinoise oué
9 février 2006 à 07:36
C’est toi le chinois, pas moi. Image corrigée les intitulés étaient inversés.
9 février 2006 à 08:54
Bravo Dew, tu as gagné 15ms, que vas tu faire de tout ce temps ?
9 février 2006 à 09:51
branlette de webmaster ;) (je cautionne ceci étant)
9 février 2006 à 09:59
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...
9 février 2006 à 10:29
Le mieux est encore de séparer le code php du code html :
<?php
$nom = "Dews Blog";
?>
Bienvenue sur <?php echo "$nom"; ?> !
9 février 2006 à 10:44
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">
<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
9 février 2006 à 11:01
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 :)
9 février 2006 à 11:17
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
9 février 2006 à 13:23
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…)
9 février 2006 à 13:31
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é)
9 février 2006 à 13:49
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 !
9 février 2006 à 13:58
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…
9 février 2006 à 14:17
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.
9 février 2006 à 18:56
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.
9 février 2006 à 19:53
ç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.
9 février 2006 à 20:41
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...
9 février 2006 à 21:26
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 :).
9 février 2006 à 21:59
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.
10 février 2006 à 08:48
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.
10 février 2006 à 09:43
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.
10 février 2006 à 14:39
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
10 février 2006 à 14:46
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.
10 février 2006 à 16:21
Tant mieux tu n’as pas à choisir.
7 mai 2006 à 16:17
Salut à tous,
encore plus rapide et plus lisible :
<meta name="description" content="<?php echo($meta_description) ?>" />
<meta name="description" content="<?=$meta_description?>" />
Vola :p