Une micro optimisation dans un cas bien particulier de l'utilisation de la fonction strlen consiste à remplacer strlen par des isset.
L'optimisation présentée dans cet article s'applique lorsque l'on effectue un test sur une longueur de chaine.
Code avec strlen
Voici le code écrit par le développeur php lambda :
<?php
if(strlen($string) === 3)
{
echo 'ok';
}
else
{
echo 'ko';
}
?>
Code équivalent avec les isset
Maintenant un code écrit par un développeur php avancé ou un codeur C reconverti :
<?php
if(isset($string[2]) === true && isset($string[3]) === false)
{
echo 'ok';
}
else
{
echo 'ko';
}
?>
Fonction basée sur l'optimisation avec isset
Maintenant le développeur php lambda veut utiliser la puissance de cette optimisation dans sa fonction perso et il écrit la fonction suivante :
<?php
function strlencompare($string,$length)
{
return isset($string[$length - 1]) === true && isset($string[$length]) === false;
}
?>
Benchmark des trois solutions proposées
Maintenant voici le code du benchmark pour évaluer la rapidité des différentes solutions :
<?php
$start = microtime(true);
for($i=1;$i<10000;$i++)
{
$bool = isset($string[2]) === true && isset($string[3]) === false;
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for($i=1;$i<10000;$i++)
{
$bool = strlen($string) === 3;
}
var_dump(microtime(true) - $start);
$start = microtime(true);
for($i=1;$i<10000;$i++)
{
$bool = strlencompare($string,3);
}
var_dump(microtime(true) - $start);
?>
Résultats du benchmark
isset : 0.011899948120117
strlen : 0.029593944549561
strlencompare : 0.04882502555847
Conclusion
En interprétant ces résultats on voit bien que l'optimisation présentée apporte un réel gain de performance (300 % environ) par rapport à l'utilisation de strlen au détriment de la lisibilité du code.
En écrivant une fonction basée sur la micro optimisation par isset, le développeur lambda c'est tiré une balle dans le pied car il a perdu sur les deux tableaux : performances moindre et lisibilité réduite.
Image : buildscharacter