Un appel de fonction en PHP est cher. Voici un petit benchmark pour tester:
// create test string
$string = str_repeat('a', 1000);
$maxChars = 500;
// with function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
strlen($string) <= $maxChars;
}
echo 'with function call: ', microtime(true) - $start, "\n";
// without function call
$start = microtime(true);
for ($i = 0; $i < RUNS; ++$i) {
!isset($string[$maxChars]);
}
echo 'without function call: ', microtime(true) - $start;
Ce teste une fonctionnellement identique au code à l'aide d'une fonction en premier (strlen
), puis sans l'aide d'une fonction (isset
n'est pas une fonction).
J'obtiens le résultat suivant:
with function call: 4.5108239650726
without function call: 0.84017300605774
Comme vous pouvez le voir à la mise en œuvre à l'aide d'un appel de fonction est plus de cinq (5.38) fois plus lente que la mise en œuvre de ne pas appeler n'importe quelle fonction.
Je voudrais savoir pourquoi un appel de fonction est si cher. Quel est le principal goulot d'étranglement? Est-il la recherche dans la table de hachage? Ou de quoi est-elle si lente?
J'ai repensé à cette question, et a décidé de courir à nouveau de référence, avec XDebug complètement désactivé (pas seulement de profilage des personnes handicapées). Cela montre, que mes tests ont été assez compliquée, cette fois, avec 10000000 runs que j'ai obtenu:
with function call: 3.152988910675
without function call: 1.4107749462128
Ici un appel de fonction est seulement d'environ deux fois (2.23) comme lent, donc, la différence est de loin plus petit.
Je viens de tester le code ci-dessus sur un PHP 5.4.0 instantané et a obtenu les résultats suivants:
with function call: 2.3795559406281
without function call: 0.90840601921082
Ici, la différence a obtenu un peu plus grand encore (2.62). (Mais sur le dessus de la main, le temps d'exécution des deux méthodes a chuté de façon très significative).