Optimiser son code PHP, les chaines de caractères

© Christian PAULUS. Document créé le 17 mai 2010 , mis à jour le 16 octobre 2010.

La démocratie est le pire des régimes, à l'exception de tous les autres. Michel Audiard

Accueil du site > Astuces > PHP > Optimiser son code PHP, les chaines de caractères

Comparatif / PHP 5.3.2

On peut lire sur le net - dans de nombreux billets à propos d’optimisation de code PHP - qu’employer les apostrophes (single quote) au lieu des guillemets (double quote) pour délimiter les chaînes de caractères permet une interprétation plus rapide.

Mais cet avis ne semble pas partagé par tous. D’aucuns n’hésitent pas à classer cette particularité dans la liste des mythes qui ont la peau dure. Ce point mérite bien un test.

Une boucle de tests sur différents types

La boucle ci-dessous permet de tester la rapidité d’exécution pour les différents types de variables.

  • définition d’une variable avec une chaine de caractères (string)
  • idem en ajoutant une variable de type string
  • idem en ajoutant une variable de type int
  • idem en ajoutant une variable de type float
  • idem en ajoutant une variable de type boolean

Le tout en testant tour à tour par l’emploi des guillemets puis des apostrophes. Sans l’emploi de la boucle foreach() pour les différents types de variable, nous aurions par exemple par type :

<?php

$e 
"Test: $variable";
$e "Test: ".$variable;
$e 'Test: '.$variable;
$e 'Test: '.(string)$variable;
$e 'Test: '.strval($variable);

?>

Voici le script complet :

<?php

//
// Vérification optimisation code
//

define('LOOP'100000);
$nt 0;

function 
str_ratio($r2$r1) {
    
$ratio $r2 $r1;
    return(
round($ratio 1002));
}

function 
str_result($r$nt$legend '') {
    
    
$res '____________________' PHP_EOL 
        
'Résultats #'.$nt.': ' $legend PHP_EOL 
        
'- double quote in : '.$r[0] . PHP_EOL
        
;
        
    if(isset(
$r[3])) {
        
$res .=
              
'- double quote out: '.$r[1]
            . 
PHP_EOL
            
'- single quote    : '.$r[2]
                .
' ('.str_ratio($r[2], $r[0]).')'
                
PHP_EOL
            
'- +       cast: '.$r[3]
                .
' ('.str_ratio($r[3], $r[0]).')'
                
PHP_EOL
            
'- +   strval(): '.$r[4]
                .
' ('.str_ratio($r[4], $r[0]).')'
                
PHP_EOL
            
;
    }
    else {
        
$res .= '- single quote    : '.$r[1]
            .
' ('.str_ratio($r[1], $r[0]).')'PHP_EOL
            
;
    }

    
$res .= PHP_EOL ;

    return(
$res);
}

$tests = array(
    
'(rien)' => ''
    
'string' => 'optimiser le code PHP'
    
'integer' => 5
    
'float' => 5.32
    
'boolean' => true
);

foreach(
$tests as $k => $v) {
    
    
$r = array();

    if(
$v) {
        
// double quote
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e "Test: $v";
        }
        
$r[] = microtime(1) - $s;
        
        
// double quote
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e "Test: ".$v;
        }
        
$r[] = microtime(1) - $s;

        
// single quote
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e 'Test: '.$v;
        }
        
$r[] = microtime(1) - $s;
        
        
// single quote + cast
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e 'Test: '.(string)$v;
        }
        
$r[] = microtime(1) - $s;
        
        
// single quote +strval
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e 'Test: '.strval($v);
        }
        
$r[] = microtime(1) - $s;
    }
    else {
        
// simple test d'assignation
        
        // double quote
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e "Test: ";
        }
        
$r[] = microtime(1) - $s;
        
        
// single quote
        
$s microtime(1);
        for(
$ii=0$ii<LOOP$ii++) {
            
$e 'Test: ';
        }
        
$r[] = microtime(1) - $s;
        
    }
    echo(
str_result($r, ++$nt$k.' "'.$v.'"'));
}


?>

Si problème de copié/collé, voici ce script compressé :

GZ - 690 octets

Le test est effectué sur deux machines différentes, 5 fois. Le résultat donné ci-dessous est un résultat moyen de ces essais.

____________________
Résultats #1: (rien) ""
- double quote in : 0.0283849239349
- single quote    : 0.0276989936829 (97.58)

____________________
Résultats #2: string "optimiser le code PHP"
- double quote in : 0.0373818874359
- double quote out: 0.0401608943939
- single quote    : 0.0296900272369 (79.42)
- +       cast: 0.0374131202698 (100.08)
- +   strval(): 0.0688490867615 (184.18)

____________________
Résultats #3: integer "5"
- double quote in : 0.0512459278107
- double quote out: 0.0460548400879
- single quote    : 0.0450558662415 (87.92)
- +       cast: 0.0506730079651 (98.88)
- +   strval(): 0.0769929885864 (150.24)

____________________
Résultats #4: float "5.32"
- double quote in : 0.101152896881
- double quote out: 0.0850100517273
- single quote    : 0.0847709178925 (83.8)
- +       cast: 0.0877349376678 (86.73)
- +   strval(): 0.113301992416 (112.01)

____________________
Résultats #5: boolean "1"
- double quote in : 0.0409369468689
- double quote out: 0.0412731170654
- single quote    : 0.0410408973694 (100.25)
- +       cast: 0.0362858772278 (88.64)
- +   strval(): 0.0674169063568 (164.68)

En résumé, c’est bien un mythe pour la simple attribution.

Mais en ce qui concerne la concaténation ou l’insertion, il y a visiblement un gain qui peut aller jusqu’à 30 %.

Et 30 % de 1.90734863281E-6 (c’est le coût d’un $e=$variable) ne mérite pas forcément la mise en chantier du projet "optimisation de mon application".

Au passage, remarquons que la fonction strval() est bien plus lente qu’un simple cast.

Plussoyez !

Les forums sont fermés.