En PHP, il existe de nombreuses fonctions. Tellement nombreuses que certaines se révèlent redondantes. Parfois avec des performances différentes. Nous allons étudier aujourd’hui les différentes méthodes nous permettant de caster (changer le type) de nos variables.
Pour ce faire, nous nous baserons sur la conversion d’un nombre réel (float) grâce à l’utilisation de trois méthodes :
- floatvar
- Simple casting : (float)
- settype
Pour faire ces tests, je me suis basé sur le code suivant :
$maxLoop = 10000000;
for( $c = 0 ; $c < = $maxLoop ; $c++ )
{
$timer1 = microtime(true);
floatval($i);
$timer2 = microtime(true);
$average_floatval += ($timer2 - $timer1);
$timer1 = microtime(true);
(float)$i;
$timer2 = microtime(true);
$average_float += ($timer2 - $timer1);
$timer1 = microtime(true);
settype($i, ‘float’);
$timer2 = microtime(true);
$average_settype += ($timer2 - $timer1);
}
Il suffit ensuite de diviser les différentes moyennes par le nombre d’occurences, et on tombe sur la durée moyenne d’exécution du cast.
Afin d’obtenir des tests significatifs en statistiques, il est important de se baser sur une population la plus vaste possible. C’est pourquoi nous effectuons 10.000.000 (oui, dix millions !) de tests. Nous pourrions aller plus loin, mais il a déjà fallu mettre en place une directive set_time_limit pour achever tout cela. ;)
Les résultats, sans plus attendre…
floatval 2.141 µs (float) 1.87 µs settype 2.387 µs
Ainsi, nous voyons que le casting direct est 14 % plus rapide par rapport à floatval. Comme quoi il serait grand temps de faire un peu de ménage dans les fonctions PHP : fonctions redondantes, pas optimisées, etc… ;)













2008-08-24 à 9.36 pm
Il est bien connu que l’appel à une fonction est bien plus lent que l’appel à une structure de language. Les résultats ne sont donc pas si étonnant (les deux fonctions étant les plus lentes).
C’est comme l’appel à $toto[] = ‘machin’ et array_push($toto, ‘machin’). Le deuxième est bien plus lent
2008-08-24 à 11.18 pm
Effectivement, un appel de fonction est coûteux en mémoire. Cependant, on aurait pu penser que ces fonctions permettraient justement d’optimiser tous les traitements derrières. Il n’en est rien au final.
Si quelqu’un connaît le but de la création de ces fonctions, qu’il parle maintenant ou se taise à jamais. :p