<html>
<head>
<title>PHP bench</title>
<style type="text/css">
p {margin:40px 20px;}
</style>
</head>
<body>
<?php

if (isset($_GET['source']))
{
    
?><nobr><?php
    highlight_file
('bench.php');
    
?></nobr><?php
    
exit();
}


error_reporting(0);
$time_start=0;
$duration=0;
$test=1;

?>
<h2>Choisissez un test :</h2>
<ul>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=string">Guillemets et apostrophes dans les chaînes</a></li>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=foreach"><code>while (list($key,$value) = each($array))</code> ou <code>foreach</code> ?</a>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=array"><code>$array['key']</code> - <code>$array[key]</code></a></li>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=strreplace"><code>str_replace</code> : plusieurs appels ou avec des tableaux ?</a></li>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=accent">Application 1 : enlever les accents</a></li>
<li><a href="<?=$_SERVER['PHP_SELF']?>?test=file"><code>file_exists</code> ou <code>is_file</code> ?</a></li>
<li><a href="<?=$_SERVER['PHP_SELF']?>?source">Voir la source de cette page</a></li>
</ul>
<?php

  
function start(){global $time_start$time_start=getmicrotime();}
  function 
stop(){global $time_start,$duration$duration=getmicrotime()-$time_start;}
  function 
getmicrotime(){
    list(
$usec$sec) = explode(' ',microtime());
    return ((float)
$usec + (float)$sec);
  }
  function 
resultat($nb=100000 /*nb d'occurences*/$txt 'instructions'){
    global 
$duration;
    return 
'<font color="red">Durée: '.round($duration,5).' s, Vitesse: '.round($nb/$duration).' '.$txt.' par seconde</font>';
  }


##############################
## STRINGS : " ' ET $ ########
##############################


if ($_GET['test']=='string') {
?><h2>Test des guillemets et apostrophes dans les chaînes</h2><?php
    
echo highlight_string('<?php for ($i=0; $i<1000; $i++) et for ($j=0; $j<100; $j++) ?>',true).'<br />soit $ instructions à chaque test.<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Chaine avec des apostrophes sans $ à l\'intérieur</i><br />'
        
.highlight_string('<?php $chaine=\'Ceci est une chaîne.\'; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine='Ceci est une chaîne.';
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Chaine avec des apostrophes et des $ à l\'intérieur</i><br />'
        
.highlight_string('<?php $chaine=\'Ceci est une chaîne.$i$j\'; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine='Ceci est une chaîne.$i$j';
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Chaine avec apostrophes et concaténation de $i et $j</i><br />'
        
.highlight_string('<?php $chaine=\'Ceci est une chaîne.\'.$i.$j; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine='Ceci est une chaîne.'.$i.$j;
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();
  
    echo 
'TEST '.($test++).' --- <i>Chaine avec guillements, puis concaténation de $i et $j.</i><br />'
        
.highlight_string('<?php $chaine="Ceci est une chaîne.".$i.$j; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine="Ceci est une chaîne.".$i.$j;
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Chaine avec guillements et les variables à l\'intérieur.</i><br />'
        
.highlight_string('<?php $chaine="Ceci est une chaîne.$i$j"; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine="Ceci est une chaîne.$i$j";
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Chaine avec guillements et des $ à l\'intérieur, qui ne sont pas '
        
.'forcément des variables</i><br />'
        
.highlight_string('<?php $chaine="Ceci est $une chaîne.$i$j"; ?>',true).'<br />';
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++) 
        
$chaine="Ceci est $une chaîne.$i$j";
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- Avant la boucle : '.highlight_string('<?php $une="i"; ?>',true).'<br />'
        
.'Dans la boucle : '.highlight_string('<?php $chaine="Ceci est ${une} chaîne.$i$j"; ?>',true).'<br />';
    
$une="i";
    
start();
    for (
$i=0$i 1000$i++) for ($j=0$j 100$j++)
        
$chaine="Ceci est ${$une} chaîne.$i$j";
    
stop();
    echo 
'Résultat: '.$chaine.'<br />'.resultat().'<p>';

    
flush();
    
?><h2>Conclusion...</h2>
<p>Utilisez au maximum les chaînes avec des apostrophes, et en concaténant les
variables. Le pire à faire est (et je le vois souvent !) <code>$foo = "$bar";</code>.
<br />Attention toutefois, les caractères spéciaux (\t \n... ne passent pas dans les
chaînes entourées d'apostrophes. On écrira alors <code>echo $variable."\n";</code>
</p><?php

//Fin test strings



##############################
## WHILE LIST / FOREACH ######
##############################


elseif ($_GET['test']=='foreach')
{
?><h2><code>while (list($key,$value) = each($array))</code> ou <code>foreach</code> ?</h2>
<div>On commence par un array avec 10&nbsp;000 valeurs qu'on parcours 100 fois...</div>
<p><?php
//Remplissage $array
for ($i=1;$i<=10000;$i++) $array[$i] = $i;
$parcours 100;

//premier test avec 10000 valeurs dans array, 2e test avec 5 valeurs.
for ($for=1$for<=2$for++)
{
    
$sizeof sizeof($array);
    echo 
'sizeof($array) = '.$sizeof.'<br/>Nb parcours = '.$parcours.'<p>';
    
$instructions = ($parcours) * ($sizeof);
    
flush();
    
    echo 
'TEST '.($test++).' --- <i>for... soyons fou! :-D</i><br />'
        
.highlight_string('<?php for ($i=1;$i<='.$sizeof.';$i++) {$j=$array[$i];} ?>',true).'<br />';
    
start();
    for (
$p=0;$p<$parcours;$p++)
        for (
$i=1;$i<=$sizeof;$i++)
        {
$j=$array[$i];}
    
stop();
    echo 
resultat($instructions).'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>while list</i><br />'
        
.highlight_string('<?php while(list($k,$v)=each($array)) {$j=$v;} ?>',true).'<br />';
    
start();
    for (
$p=0;$p<$parcours;$p++)
    {
        
reset($array);
        while(list(
$k,$v)=each($array))
        {
$j=$v;}
    }
    
stop();
    echo 
resultat($instructions).'<p>';

    
flush();
    
    echo 
'TEST '.($test++).' --- <i>foreach</i><br />'
        
.highlight_string('<?php foreach($array as $k=>$v) {$j=$v;} ?>',true).'<br />';
    
start();
    for (
$p=0;$p<$parcours;$p++)
        foreach(
$array as $k=>$v)
        {
$j=$v;}
    
stop();
    echo 
resultat($instructions).'<p>';

    
flush();
    
    echo 
'TEST '.($test++).' --- <i>foreach</i><br />'
        
.highlight_string('<?php foreach($array as $v) {$j=$v;} ?>',true).'<br />';
    
start();
    for (
$p=0;$p<$parcours;$p++)
        foreach(
$array as $v)
        {
$j=$v;}
    
stop();
    echo 
resultat($instructions).'<p>';

    if (
$for==1) echo '<hr/>Et maintenant on test sur un tableau beaucoup plus petit (5 éléments) parcouru 200&nbsp;000 fois<p>';
    
$array = array(1,2,3,4,5);
    
$parcours 200000;
}
?><h2>Conclusion...</h2>
<p>Parfois c'est utile d'être fou ;-) Lorsque le tableau est un banal<br/>
<code>$array[0]=...<br/>$array[1]=...<br/>$array[<i>i</i>]=...;</code><br/>
Le <code>for</code> est plus rapide si le tableau est volumineux.<br/>
Le <code>while list</code> est le grand perdant de ce test. Son seul avantage semble d'utiliser
moins de mémoire que le <code>foreach</code> mais c'est tout.<br/>
Le <code>foreach</code> consomme plus de mémoire mais est plus rapide pour des petits tableaux.
Ceci s'explique puisque le <code>foreach</code> doit instantier <code>$key</code> et <code>$value</code>, ce qui est très rapide
pour des petits tableaux, mais qui peut devenir une perte de temps pour une grande quantité de données.
<br/>Pour le <code>as $key=>$value</code>, si <code>$key</code> n'est pas utilisé il faut l'enlever pour gagner de
la vitesse.
</p>
<?php
}



##############################
## ARRAY #####################
##############################


elseif ($_GET['test']=='array')
{
?><h2><code>$array["key"]</code> - <code>$array[key]</code></h2>
<p>Un tableau peut être indexé par des chaînes de caractères et non pas uniquement par des
chiffres (0, 1, ... <i>i</i>).<br/>Quand on possède le tableau
<br/><?=highlight_string("<?php \$tablo = array('nom' => 'Sylvain',
                  'age' => '21'); ?>"
true)?><br/>
On peut directement écrire <code>$tablo['nom']</code>. Comme c'est une chaîne de caractères qui
sert de clé du tableau, il faut mettre, comme à toutes les chaînes, des guillemets ou (mieux!)
des apostrophes.<br/>Or, souvent on voit des choses du genre <code>$tablo[nom]</code>. PHP va
essayer de voir si <code>nom</code> n'est pas une constante définie avec <code>define(nom,'valeur');</code>
et après essaye en mettant nom dans une chaîne de caractères.<br/>Ce qui entraîne une perte de
temps !<br/>Pour vous en convaincre voici des tests.
</p>
<?php
$tablo 
= array('nom' => 'Sylvain',
        
'age' => '21');
?>Voici notre tableau initialisé :<pre style="margin:5px;padding:3px;border:1px solid gray; width:33%;"><?php print_r($tablo); ?></pre>
Les tests font 1&nbsp;000&nbsp;000 d'itérations<p><?php

    flush
();
    
    echo 
'TEST '.($test++).' --- <i>avec des apostrophes, comme il faudrait faire quand on code bien :-p</i><br />'
        
.highlight_string('<?php $a = $tablo[\'nom\']; ?>',true).'<br />';
    
start();
    for(
$i=0;$i<1000000;$i++)
        
$a=$tablo['nom'];
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(1000000).'<p>';

    
flush();
    
    echo 
'TEST '.($test++).' --- <i>quand on code mal</i><br />'
        
.highlight_string('<?php $a = $tablo[nom]; ?>',true).'<br />';
    
start();
    for(
$i=0;$i<1000000;$i++)
        
$a=$tablo[nom];
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(1000000).'<p>';

    
flush();
    
    echo 
'TEST '.($test++).' --- <i>du code encore plus crade !!! mais un peu plus rapide que le test précédent</i><br />'
        
.highlight_string('<?php $a = "$tablo[nom]"; ?>',true).'<br />';
    
start();
    for(
$i=0;$i<1000000;$i++)
        
$a="$tablo[nom]";
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(1000000).'<p>';

?><h2>Conclusion...</h2>
<p>C'est tout simplement idiot de faire un script 3 fois plus lent juste parce qu'on ne met
pas les "indices" de tableaux entre guillemets ou apostrophes !<br/>Évidemment je parle des
tableaux dont les "clés" sont des chaînes de caractères !</p><?php
}


##############################
## STR_REPLACE ###############
##############################

elseif ($_GET['test']=='strreplace')
{
?>
<h2><code>str_replace</code> : plusieurs appels ou avec des tableaux ?</h2>
<p>La fonction <a href="http://fr.php.net/str_replace" target="_blank"><code>str_replace</code></a>
accepte des tableaux en paramètres, elle fait alors un remplacement pour chaque élément du
tableau de départ par l'élément correspondant du tableau d'arrivée. Ainsi :<br/>
<?php highlight_string('<?php $a = str_replace(\'x\',\'y\',$a); $a = str_replace(\'a\',\'b\',$a);?>'); ?>
<br />est équivalent à
<?php highlight_string('<?php $a = str_replace(array(\'x\',\'a\'),array(\'y\',\'b\'),$a); ?>'); ?></p>
<p>Lequel est le plus rapide ?<br/>On commence avec <code>$a = 'abcxyz';</code><p>
<?php

    
echo 'TEST '.($test++).' --- <i>plusieurs appels de <code>str_replace</code></i><br />'
        
.highlight_string('<?php $a = str_replace(\'x\',\'y\',$a); $a = str_replace(\'a\',\'b\',$a);?>',true).'<br />';
    
$a 'abcxyz';
    
start();
    for(
$i=0;$i<100000;$i++)
    {
        
$a str_replace('x','y',$a);
        
$a str_replace('a','b',$a);
    }
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';
    
    
flush();
    
    echo 
'TEST '.($test++).' --- <i>plusieurs appels mais imbriqués</i><br />'
        
.highlight_string('<?php $a = str_replace(\'x\',\'y\', str_replace(\'a\',\'b\',$a));?>',true).'<br />';
    
start();
    
$a 'abcxyz';
    for(
$i=0;$i<100000;$i++)
        
$a str_replace('x','y'str_replace('a','b',$a));
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>Un seul appel avec des tableaux</i><br />'
        
.highlight_string('<?php $a = str_replace(array(\'x\',\'a\'), array(\'y\',\'b\'), $a); ?>',true).'<br />';
    
start();
    
$a 'abcxyz';
    for(
$i=0;$i<100000;$i++)
        
$a str_replace(array('x','a'), array('y','b'), $a);
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>et si les tableaux sont initialisés avant... ?</i><br />'
        
.highlight_string('<?php $t1 = array(\'x\',\'a\');\n$t1 = array(\'y\',\'b\');
$a = str_replace($t1, $t2, $a); ?>'
,true).'<br />';
    
start();
    
$a 'abcxyz';
    
$t1 = array('x','a');$t2=array('y','b');
    for(
$i=0;$i<100000;$i++)
        
$a str_replace($t1$t2$a);
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();


?>
<p>On continue avec une chaîne plus longue et plus de remplacements.
<br/><code>$a = 'Hello ! abcdefghijklmnopqrstuvwxyz';</code> à remplacer en <code>'Bonjour ! ABCDEDFGHIJKLMNOPQRSTUVWXYZ'</code><p>
<?php

    
echo 'TEST '.($test++).' --- <i>plusieurs appels de <code>str_replace</code></i><br />'
        
.highlight_string('<?php $a = str_replace(\'Hello\',\'Bonjour\',$a); $a = str_replace(\'a\',\'A\',$a);... ?>',true).'<br />';
    
$a 'Hello ! abcdefghijklmnopqrstuvwxyz';
    
start();
    for(
$i=0;$i<100000;$i++)
    {
        
$a str_replace('Hello','Bonjour',$a);
        
$a str_replace('a','A',$a);$a str_replace('b','B',$a);$a str_replace('c','C',$a);
        
$a str_replace('d','D',$a);$a str_replace('e','E',$a);$a str_replace('f','F',$a);
        
$a str_replace('g','G',$a);$a str_replace('h','H',$a);$a str_replace('i','I',$a);
        
$a str_replace('j','J',$a);$a str_replace('k','K',$a);$a str_replace('l','L',$a);
        
$a str_replace('m','M',$a);$a str_replace('n','N',$a);$a str_replace('o','O',$a);
        
$a str_replace('p','P',$a);$a str_replace('q','Q',$a);$a str_replace('r','R',$a);
        
$a str_replace('s','S',$a);$a str_replace('t','T',$a);$a str_replace('u','U',$a);
        
$a str_replace('v','V',$a);$a str_replace('w','W',$a);$a str_replace('x','X',$a);
        
$a str_replace('y','Y',$a);$a str_replace('z','Z',$a);
    }
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';
    
    
flush();
    
    echo 
'TEST '.($test++).' --- <i>plusieurs appels mais imbriqués</i><br />'
        
.highlight_string('<?php $a = str_replace(\'Hello\',\'Bonjour\', str_replace(\'a\',\'A\',... $a));?>',true).'<br />';
    
start();
    
$a 'Hello ! abcdefghijklmnopqrstuvwxyz';
    for(
$i=0;$i<100000;$i++)
        
$a str_replace('Hello','Bonjour',str_replace('a','A',str_replace('b','B',str_replace('c','C',
            
str_replace('d','D',str_replace('e','E',str_replace('f','F',
            
str_replace('g','G',str_replace('h','H',str_replace('i','I',
            
str_replace('j','J',str_replace('k','K',str_replace('l','L',
            
str_replace('m','M',str_replace('n','N',str_replace('o','O',
            
str_replace('p','P',str_replace('q','Q',str_replace('r','R',
            
str_replace('s','S',str_replace('t','T',str_replace('u','U',
            
str_replace('v','V',str_replace('w','W',str_replace('x','X',
            
str_replace('y','Y',str_replace('z','Z',$a)))))))))))))))))))))))))));
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<br />';
?>Heu... Là on voit un petit soucis... dans cette écriture imbriquée, il faut faire attention
à mettre le premier remplacement en dernier !<p><?php

    flush
();

    echo 
'TEST '.($test++).' --- <i>Un seul appel avec des tableaux</i><br />'
        
.highlight_string('<?php $a = str_replace(array(\'Hello\',\'a\',\'b\',...), array(\'Bonjour\',\'A\',\'B\'), $a); ?>',true).'<br />';
    
start();
    
$a 'Hello ! abcdefghijklmnopqrstuvwxyz';
    for(
$i=0;$i<100000;$i++)
        
$a str_replace(array('Hello','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','w','x','y','z'),
                        array(
'Bonjour','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y','Z'),
                        
$a);
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i>et si les tableaux sont initialisés avant... ?</i><br />'
        
.highlight_string('<?php $t1 = array(\'Hello\',\'a\'...);\n$t1 = array(\'Bonjour\',\'A\'...);
$a = str_replace($t1, $t2, $a); ?>'
,true).'<br />';
    
start();
    
$a 'Hello ! abcdefghijklmnopqrstuvwxyz';
    
$t1 = array('Hello','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','r','s','t','u','v','w','x','y','z');
    
$t2 = array('Bonjour','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y','Z');
    for(
$i=0;$i<100000;$i++)
        
$a str_replace($t1$t2$a);
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();

?><h2>Conclusion...</h2>
<p>Pour de petits remplacements (du genre remplacer 3 caractères par 3 autres caractères)
il est conseillé de ne pas utiliser des tableaux et d'imbriquer les <code>str_replace</code>
(test 2), mais le code devient vite illisible et source d'erreur (test 6).
<br/>Pour plus de remplacements, il est plus rapide d'utiliser des tableaux, même si
l'instanciation d'un array prend un peu du temps.<p>
Ces tests (surtout la 2e série) sont volontairement bidons, un <a href="http://fr.php.net/strtoupper" target="_blank"><code>strtoupper</code></a>
aurait fait l'affaire, ou au pire un <a href="http://fr.php.net/strtr" target="_blank"><code>strtr</code></a> !
<br/>Voyons voir ça, un <code>strtr</code> :<p>
<?php

    
echo 'TEST '.($test++).' --- <i><code>strtr</code></i><br />'
        
.highlight_string('<?php $a = strtr(str_replace(\'Hello\', \'Bonjour\', $a), \'abc...xyz\', \'ABC...XYZ\'); ?>',true).'<br />';
    
start();
    
$a 'Hello ! abcdefghijklmnopqrstuvwxyz';
    for(
$i=0;$i<100000;$i++)
        
$a strtr(str_replace('Hello''Bonjour'$a), 'abcdefghijklmnopqrstuvwxyz''ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    
stop();
    echo 
'Résultat : $a='.$a.'<br/>'.resultat(100000'fois').'<p>';

    
flush();
}


#########################
## ENLEVER LES ACCENTS ##
#########################
elseif ($_GET['test']=='accent')
{
?><h2>Application 1 : Enlever les accents</h2>
<p>Les anglais s'en foutent mais pas nous :-P<br/>On veut souvent enlever les accents d'une
chaîne de caractères. Voici plusieurs solutions pour tester leur rapidité, à 10&nbsp;000
occurences sur un texte d'une trentaine de lignes.<p>
<?php

    
echo 'TEST '.($test++).' --- <i>avec des <code>ereg_replace</code></i><br />'
        
.highlight_string('<?php     $chaine = ereg_replace(\'[àâäåãáÂÄÀÅÃÁæÆ]\',\'a\', $chaine);
    $chaine = ereg_replace(\'[çÇ]\',\'c\', $chaine);
    $chaine = ereg_replace(\'[éèêëÉÊËÈ]\',\'e\', $chaine);
    $chaine = ereg_replace(\'[ïîìíÏÎÌÍ]\',\'i\', $chaine);
    $chaine = ereg_replace(\'[ñÑ]\',\'n\', $chaine);
    $chaine = ereg_replace(\'[öôóòõÓÔÖÒÕ]\',\'o\', $chaine);
    $chaine = ereg_replace(\'[ùûüúÜÛÙÚ]\',\'u\', $chaine);
    $chaine = ereg_replace(\'[ÿ]\',\'y\', $chaine);
 ?>'
,true).'<br />';
    
start();
    
$a "Chirac rend visite au Président George debeuliou Bush. - Dis-moi,
George, comment fais-tu pour avoir une équipe aussi performante, alors
que moi je suis entouré d'une bande de crétins ? - C'est simple, Jack,
je teste mes ministres en permanence. S'ils répondent juste, ils
restent. Sinon, je les vire. C'est la sélection naturelle, je suis sûr
de ne garder que les meilleurs. Attends, tu vas voir. Et Bush appelle
Colin Powell. - Colin, je vais te poser une question. Tu connais la
règle, si tu te trompes, tu
es viré, OK ? Alors voila : C'est l'enfant de ta mère, mais ce n'est ni
ton frère, ni ta soeur, qui est-ce ? Colin Powell réfléchit quelques
secondes, puis dit : - Facile : c'est moi ! - Parfait, dit Bush, je te
garde. Chirac est très impressionné. A peine rentré à Paris, il convoque
Raffarin - Raff, je vais te poser une question. Si tu réponds juste, tu
restes à Matignon. Sinon, tu es viré. Voilà : C'est l'enfant de ta mère,
mais ce n'est ni ton frère, ni ta soeur, qui est-ce ? Raffarin, qui
connaît ses
limites, demande un délai de réflexion. Chirac lui donne 24 heures.
L'autre fonce à Matignon, convoque son cabinet, et bientôt toute une
bande d'énarques planchent sur la question. Les hypothèses fusent. A la
fin, un type plus malin que les autres dit : - Il faut demander à Juppé
! Il a toujours raison, et il sait ce que le Président a derrière la
tête. Excellente idée ! Raffarin appelle aussitôt Juppé : - Allô Alain ?
Voilà, c'est l'enfant de ta mère, mais ce n'est ni ton frère, ni ta
soeur, qui est-ce ?
Juppé ricane légèrement, et avec le ton supérieur qu'on lui connaît
répond : - Facile, c'est moi. Le lendemain, Raffarin se précipite à
l'Elysée : - Monsieur le Président, Monsieur le Président, je sais qui
c'est - Bien, bien Raff ! Alors, l'enfant de ta mère qui n'est ni ton
frère ni ta soeur, qui est-ce ? - C'est Juppé, Monsieur le Président.
Chirac ouvre des yeux ronds. <<<<<<<<<<<<<<<<- Fais tes bagages, Raff.
La bonne réponse, c'est Colin Powell"
;
    
$chaine=$a;
    for(
$i=0;$i<1000;$i++)
    {
        
$chaine ereg_replace('[àâäåãáÂÄÀÅÃÁæÆ]','a'$chaine);
        
$chaine ereg_replace('[çÇ]','c'$chaine);
        
$chaine ereg_replace('[éèêëÉÊËÈ]','e'$chaine);
        
$chaine ereg_replace('[ïîìíÏÎÌÍ]','i'$chaine);
        
$chaine ereg_replace('[ñÑ]','n'$chaine);
        
$chaine ereg_replace('[öôóòõÓÔÖÒÕ]','o'$chaine);
        
$chaine ereg_replace('[ùûüúÜÛÙÚ]','u'$chaine);
        
$chaine ereg_replace('[ÿ]','y'$chaine);
    }
    
stop();
    echo 
resultat(1000'fois').'<p>';

    
flush();

    echo 
'TEST '.($test++).' --- <i><code>strtr</code></i><br />'
        
.highlight_string('<?php $a = strtr($a, \'àâäåã...\', \'aaaa....\'); ?>',true).'<br />';
    
start();
    
$chaine $a;
    for(
$i=0;$i<1000;$i++)
        
$a strtr($chaine'àâäåãáÂÄÀÅÃÁæÆçÇéèêëÉÊËÈïîìíÏÎÌÍñÑöôóòõÓÔÖÒÕùûüúÜÛÙÚÿ',
                            
'aaaaaaaaaaaaaacceeeeeeeeiiiiiiiinnoooooooooouuuuuuuuy');
    
stop();
    echo 
resultat(1000'fois').'<p>';

    
flush();

?><h2>Conclusion...</h2>
Alors là y'a pas photo ! Le strtr est 80 fois plus rapide que quelques regexp.
<?php

}



############################
## EXISTANCE D'UN FICHIER ##
############################
elseif ($_GET['test']=='file')
{
?><h2><code>file_exists</code> ou <code>is_file</code> ?</h2>
<p>On veut tester l'existence d'un fichier. Quelle fonction est la plus rapide ?<p>
<?php
    flush
();
    
clearstatcache();

    echo 
'TEST '.($test++).' --- <i><code>file_exists</code></i><br />'
        
.highlight_string('<?php $a = file_exists(\'bench.php\'); ?>',true).'<br />';
    
start();
    
$a;
    for(
$i=0;$i<100000;$i++)
        
$a file_exists('bench.php');
    
stop();
    echo 
resultat(100000).'<p>';

    
flush();
    
clearstatcache();

    echo 
'TEST '.($test++).' --- <i><code>is_file</code></i><br />'
        
.highlight_string('<?php $a = is_file(\'bench.php\'); ?>',true).'<br />';
    
start();
    
$a;
    for(
$i=0;$i<100000;$i++)
        
$a is_file('bench.php');
    
stop();
    echo 
resultat(100000).'<p>';

    
flush();
?>Pour simuler le test sur plusieurs fichier, on met un <a href="http://fr.php.net/clearstatcache" target="_blank">clearstatcache()</a> avant chaque test...<p><?php

    flush
();

    echo 
'TEST '.($test++).' --- <i><code>file_exists</code></i><br />'
        
.highlight_string('<?php $a = file_exists(\'bench.php\'); ?>',true).'<br />';
    
start();
    
$a;
    for(
$i=0;$i<100000;$i++)
    {
        
clearstatcache();
        
$a file_exists('bench.php');
    }
    
stop();
    echo 
resultat(100000).'<p>';

    
flush();
    
clearstatcache();

    echo 
'TEST '.($test++).' --- <i><code>is_file</code></i><br />'
        
.highlight_string('<?php $a = is_file(\'bench.php\'); ?>',true).'<br />';
    
start();
    
$a;
    for(
$i=0;$i<100000;$i++)
    {
        
clearstatcache();
        
$a is_file('bench.php');
    }
    
stop();
    echo 
resultat(100000).'<p>';

?><h2>Conclusion...</h2>
<p>La différence entre les deux n'est pas énorme au niveau vitesse. <code>is_file</code>
est même parfois plus rapide. Surtout il présente l'avantage de tester l'existence et le
type (est-ce un fichier ? un répertoire ?).
<br/>Les tests 3 et 4 simulent le test d'existence de 100&nbsp;000 fichiers différents.
<br/>On fait un essai avec des fichiers qui n'existent pas<p>
<?php
    
echo 'TEST '.($test++).' --- <i><code>is_file</code></i><br />'
        
.highlight_string('<?php $a = is_file($i.\'.php\'); ?>',true).'<br />';
    
start();
    
$a;
    for(
$i=0;$i<100000;$i++)
    {
        
clearstatcache();
        
$a is_file($i.'.php');
    }
    
stop();
    echo 
resultat(100000).'<p>';
?>L'exécution est un peu plus rapide car PHP ne met pas en mémoire les infos sur le fichiers
(infos qui sont supprimées par le clearstatcache).

<?php

}
else
{
?>
<p>La config du serveur : <?=$_SERVER['SERVER_SOFTWARE']?></p>
<p>Au moment des tests et conclusions que j'en ai tiré, la config du serveur était : Apache/2.0.47 (Win32) PHP/4.3.3.
Il y a des différences d'un serveur à un autre&nbsp;!</p>

<p><a href="http://www.developpez.net/forums/profile.php?mode=viewprofile&u=11771"
title="Profil de Iubito sur les forums du Club Développez.com">Iubito</a> &middot;
<a href="http://iubito.developpez.com">http://iubito.developpez.com</a></p>
<?php
}
?>
</body>
</html>