echo() PHP, avec ou sans temporisation

© Christian PAULUS. Document créé le 15 octobre 2011 , mis à jour le 15 octobre 2011.

Un idiot pauvre est un idiot, un idiot riche est un riche. Paul Laffitte

Accueil du site > Astuces > PHP > echo() PHP, avec ou sans temporisation

Optimisation / PHP 5

Toujours à la recherche de l’optimisation de code PHP, est présentée ici une (légère) étude sur l’emploi de la fonction echo() [1]

L’environnement de test du code PHP

Autant le préciser, test réalisé sur Mac-mini :

10.8.0 Darwin Kernel Version 10.8.0 : Tue Jun 7 16:33:36 PDT 2011 ; 
root:xnu-1504.15.3 1/RELEASE_I386 i386
Apache 2.0 Handler 
PHP 5.3.5

Le code du test PHP (echo(), sans et avec temporisation

Ne compte que le temps passé à la construction de la page. Pas celui de la transmisson - du réseau. Donc très proche du temps réel, sans prendre en compte les processus parallèles. Le must serait de faire passer le serveur en mode dédié apache/php. Désolé, problème de temps. Si vous en avez, ou si vous avez le courage, les commentaires en bas de page vous ouvrent les bras.

Le code PHP pour tester echo() sans et avec temporisation : <?php

define 
('NBBOUCLE'1000);

// 256 lignes de 80 caractères
$chaine str_repeat str_repeat '.'80) . PHP_EOL 256 );

/**
 * Inutile d'afficher le test lui-même
 */
echo ('<div style="display:none;">'.PHP_EOL);

// salve d'éveil
// (histoire de réveiller php, ou apache, ou...)
for ($ii=0$ii<NBBOUCLE$ii++)
{
    echo (
$chaine);
}

// première *vraie* salve
$start microtime(1);
for (
$ii=0$ii<NBBOUCLE$ii++)
{
    echo (
$chaine);
}
$time_multi microtime(1) - $start;

// idem, avec buffer
$start microtime(1);
$buff '';
for (
$ii=0$ii<NBBOUCLE$ii++)
{
    
$buff.=$chaine;
}
echo (
$buff);
$time_buffr microtime(1) - $start;

// idem, en temporisant
$start microtime(1);
ob_start();
for (
$ii=0$ii<NBBOUCLE$ii++)
{
    echo (
$chaine);
}
echo(
ob_get_contents());
ob_end_clean();
$time_tempo microtime(1) - $start;

echo (
PHP_EOL);
echo (
'</div>'.PHP_EOL);

echo 
'<br />'.PHP_EOL;
echo 
'<pre>'.PHP_EOL;
echo 
'multi echo: '.$time_multi.' ms'.PHP_EOL;
echo 
'uniqu echo: '.$time_buffr.' ms'.PHP_EOL;
echo 
'temporisat: '.$time_tempo.' ms'.PHP_EOL;
echo 
'</pre>'.PHP_EOL;

?>

Et le résultat de 4 chargements successifs de la page :

multi echo : 0.871028900146 ms
uniqu echo : 0.814095020294 ms
temporisat : 0.230682134628 ms

multi echo : 1.25754284859 ms
uniqu echo : 1.11795186996 ms
temporisat : 0.351218938828 ms

multi echo : 1.29363012314 ms
uniqu echo : 1.02837705612 ms
temporisat : 0.216356039047 ms

multi echo : 0.881450891495 ms
uniqu echo : 1.02975702286 ms
temporisat : 0.309266090393 ms

echo() simple, multiple, ou temporisé. Le plus efficace ?

Visiblement, il y a - au final - peu d’écarts entre l’appel d’un seul ou plusieurs echo(). Le choix sera donc ici esthétique, ou pour la lisibilité du code, ou la taille finale du script php.

Par contre, temporiser à l’aide de ob_start() et ob_get_contents() est tout simplement surprenant, séduisant. Dans le cadre de ce test, on y gagne 60 %.

Mérite en tout cas que l’on s’y intéresse.

Notes

[1] Dans la série Optimisation de code PHP, vous pouvez consulter le billet Optimiser son code PHP (echo, print ou printf)

Plussoyez !

Les forums sont fermés.

  • echo() PHP, avec ou sans temporisation 24 avril 2012 15:50, par Squallynou

    Hello,

    Il ne faut pas oublier que tout ce qui fait gagner en charge CPU se fait au détriment de la charge mémoire.
    Il est normal que l’utilisation des buffers de sorties soient plus rapide car tout leur contenu est stocké en mémoire puis envoyé. Tandis que dans le cas contraire, de multiples envois sont faits, avec contrôle d’erreur etc.

    Comme toujours, l’optimisation dépend des cas : si vous avez beaucoup de données à afficher et peu de mémoire, l’utilisation des buffers de sorties vous conduira tout simplement à une erreur de dépassement mémoire.

    Les forums sont fermés.