nov 29
[PHP] Comparer la longueur d’une chaine avec isset
Je suis tombé dernièrement sur un article intéressant sur une manière particulière de savoir si une chaîne de caractères est d’une certaine longueur… avec isset !
En temps normal, j’utiliserai directement la fonction strlen(string $string), et je ne pense pas être le seul. Avec par exemple :
<?php $chaine = 'une petite phrase de test'; echo strlen($chaine); // 25 ?>
Si maintenant je veux simplement vérifier que ma chaine fasse plus d’une certaine longueur, toujours de la même façon, j’utiliserai strlen.
<?php $chaine = 'une petite phrase de test'; if(strlen($chaine) >= 20) echo 'La chaine fait au moins 20 caractères'; else echo 'La chaine est trop petite'; ?>
Il y a une autre façon de faire, en détournant quelque peut l’utilisation de la fonction isset. Comment ? C’est tout simple : une chaîne de caractère peut-être considéré comme un tableau de caractères par certaines fonctions, ce qui est le cas de isset !
Exemple :
<?php $chaine = 'une petite phrase de test'; echo $chaine[0]; // u echo $chaine[7]; // i ?>
On remarque que le premier caractère est à la position 0. Il suffit donc de faire une recherche sur le 20e caractère de la chaine, soit en position 19 dans le tableau, et voir s’il existe :
<?php $chaine = 'une petite phrase de test'; if(isset($chaine[19])) echo 'La chaine fait au moins 20 caractères'; else echo 'La chaine est trop petite'; ?>
D’après l’auteur original, cette façon est jusqu’à 5 fois plus rapide, ce qui permet de gagner … 0.4ms. Bref, les gains étant vraiment infimes, c’est plutôt une petite bidouille marrante qu’une technique ayant un impact vraiment important sur les performances de votre application, mais j’ai trouvé ça sympa. Son utilisation est aussi limité étant donné que cette façon de faire ne nous dit que si une chaine est d’une taille donnée.
Dans le genre inutile aussi, j’ai joué un peu plus avec ma chaine. Etant donné que certaines fonctions peuvent l’utiliser sous forme de tableau de caractères, le font-elles toutes ? Pour tester ça, j’ai commencé simplement de calculer le nombre de caractères dans le tableau :
<?php $chaine = 'une petite phrase de test'; echo count($chaine); // 1 ?>
Et bien non, toutes les fonctions ne peuvent pas utiliser les chaines de caractères comme des tableaux. En même temps cet exemple est vraiment débile dans le sens où pour récupérer le nombre, il existe justement strlen.
L’article original est disponible à cette adresse :
http://blog.dynom.nl/archives/String-length-vs-isset-to-check-string-lengths_20070807_5.html
Aucun article à afficher.

avril 24th, 2009 à 8:02
Ce n’est pas une petite bidouille c’est de la micro optimisation. Quand au chiffre de 5 fois plus rapide personnellement j’ai trouver un rapport de 3 fois (cf : http://postit.petitchevalroux.net/php/best-practice-remplacer-strlen-par-des-isset-php.220.html) mais bon ça doit dépendre de la machine tout ça …
En tout cas félicitation pour ton article c’est toujours bon de partager ce genre de technique ;)
avril 24th, 2009 à 9:17
J’avoue que je n’ai pas pris le temps de faire un petit test de bench pour vérifier sur le coup. Je viens de me rattraper en utilisant ton code histoire d’avoir les mêmes bases pour comparer. Pour 1000 tests, j’obtiens les résultats suivants (sous XAMPP avec PHP 5.2.8) :
isset : 0.00201819491386
strlen : 0.00288864541054
strlencompare : 0.0109094631672
C’est vrai que pour le coup, je suis assez loin des 5 fois annoncées. :/