©
. Document créé le 17 mai 2010 , mis à jour le 16 octobre 2010.Un seul arbre qui tombe fait plus de bruit qu'une forêt qui pousse. Proverbe africain
Accueil du site > Astuces > PHP > Optimiser son code PHP, les chaines de caractères
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.
La boucle ci-dessous permet de tester la rapidité d’exécution pour les différents types de variables.
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 * 100, 2));
}
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é :
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.
Les forums sont fermés.