En PHP, on sait que l'utilisation des apostrophes par rapport aux guillemets améliore la performance lorsqu'on manipule des chaînes de caractères. Ayant été témoin d'argumentaires sans fin entre programmeurs qui défendaient les bonnes pratiques, j'ai décidé de faire une démonstration pour faire parler les chiffres et mieux cibler les opportunités d'optimisation. Après tout, "premature optimization is the root of all evil"!
En utilisant une technique toute simple déjà expliquée pour mesurer le temps d'exécution d'un script (vous pouvez aussi utiliser xdebug), j'ai isolé la portion de code en question dans une itération et j'ai observé les résultats obtenus sur ce court snippet de code. La seule différence entre les deux boucles est dans la façon de concaténer la chaîne.
set_time_limit(90);Les résultats
# avec apostrophes
$startTime = microtime(true);
$iterations = 100000;
$tmp = '';
$concat = 'yz';
for($i=0 ; $i<=$iterations ; $i++){
$tmp = 'x' . $concat;
}
$endTime = microtime(true);
$elapsed = $endTime - $startTime;
echo "$elapsed secondes";
# ou echo $elapsed . ' secondes'; ?
# avec guillemets
$startTime = microtime(true);
$tmp = '';
$concat = 'yz';
for($i=0 ; $i<=$iterations ; $i++){
$tmp = "x $concat";
}
$endTime = microtime(true);
$elapsed = $endTime - $startTime;
echo "$elapsed secondes";
# ou echo $elapsed . ' secondes'; ?
1000 itérations (10 ^ 3)
- Single quotes: 0.0004279613494873 secondes
- Double quotes: 0.00057315826416016 secondes
- Single quotes: 0.0040969848632812 secondes
- Double quotes: 0.0046517848968506 secondes
- Single quotes: 0.03504490852356 secondes
- Double quotes: 0.046297073364258 secondes
- Single quotes: 0.3795599937439 secondes
- Double quotes: 0.48942708969116 secondes
- Single quotes: 3.7059290409088 secondes
- Double quotes: 4.7981967926025 secondes
- Single quotes: 38.336160898209 secondes
- Double quotes: 49.267479896545 secondes
L'argument de départ tient la route mais il faut avouer que dans de nombreux cas, les efforts déployés à essayer de gagner son point demandent beaucoup plus d'énergie par rapport au gain potentiel qu'on obtient en retour. Il reste qu'en règle générale et par souçi de bonnes pratiques, c'est une bonne idée de privilégier l'utilisation des apostrophes autant que possible. À mon humble avis, personne ne mérite de se faire taper sur les doigts s'il n'est pas aussi assidu à le faire dans des parties non-critiques de l'application. Après tout, si un script PHP venait à devoir exécuter plus d'un million de manipulations, peut-être qu'un changement de stratégie serait de mise et qu'une solution compilée serait plus appropriée...
echo "$elapsed secondes";
Faites ce que je dis... ;-)
Je savais que je me ferais taper sur les doigts ;-) Mais dis-moi, combien de temps d'exécution sauve-t-on pour cette unique ligne de code ?
Je sais que le sujet date un peu mais avez vous essayé avec des chaines beaucoup plus longues (on ne concatène que très rarement des chaines de 0 caractères) ?
@daarksim Beaucoup plus longues = de quel ordre ? Aussi, je ne comprends pas la référence à concaténer des chaînes de 0 caractères (ce qui me semble inutile). Est-ce possible d'expliquer ?