Anti-namespacez vos constantes !

Quand vous utilisez des constantes pré-définies dans un script namespacé, sans vous en rendre compte, vous perdez de 5 à 10% de temps CPU.

  1. <?php
  2. namespace CCMBG;
  3. echo CURLOPT_RETURNTRANSFER;

Cela génère l'opcode suivant :

FETCH_CONSTANT ~0 'CCMBG%5CCURLOPT_RETURNTRANSFER'
ECHO ~0

Maintenant, si on anti-namespace :

  1. <?php
  2. namespace CCMBG;
  3. echo \CURLOPT_RETURNTRANSFER;

L'opcode devient :

ECHO 19913

Seulement, quand je parle de constante, c’est également valable pour les booléens « true » et « false », qui en interne, si vous n’anti-namespacez pas deviennent des constantes :

  1. <?php
  2. namespace CCMBG;
  3. echo true;

Donne :

FETCH_CONSTANT ~0 'CCMBG%5Ctrue'
ECHO ~0

Alors que :

  1. <?php
  2. namespace CCMBG;
  3. echo \true;

Donne:

ECHO true

J’ai fait quelques petits benchs, avec des conditions sur des « true » et des « \true », et j’ai une différence entre 7% et 10% sur le temps mesuré.
Comme quoi ….

Vous aimerez aussi...

4 réponses

  1. Xavier dit :

    7 à 10% c’est important certes, mais sur 2 lignes de codes
    Donc finalement on a 2 lignes qui prennent rien comme temps pour en avoir 2 autres qui en prennent 10% de moins que rien 😉
    A mon sens ça reste de la micro optimisation, non ?

  2. Frédéric dit :

    Oui, c’est de la micro optimisation, mais si tu dois placer ça dans une boucle intensive, ça réduit aussi la charge CPU. Il y a bien d’autres optimisations à faire avant celle-là, mais si ça devient un réflexe de placer un anti-slashe, ça ne coûte rien de le faire. Il y a aussi un gain sur la mémoire.
    J’en parle ici, plus par curiosité que par recommandation (travail sur l’opcache oblige).

  3. Frédéric dit :

    Au passage, on notera que c’est également valable sur le nom des fonctions « standards » PHP.
    La perte de performance est liée au fait que PHP doit fallbacker les appels. SI la constante ou la fonction n’existe pas, il essaye la fonction ou la constante racine.

  4. dam75 dit :

    Ah bin tiens ce sera joli le futur code de PHP (du genre if (\true === \$a || \ is_numeric(\$a) ) ) … sérieux c’est quand le reboot de PHP :/ ?

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *