Optimisations de performances avec PHP 7 par Julien Pauli

SymfonyLive Paris 2017

Optimisations de performances avec PHP 7 par Julien Pauli

Julien Pauli, contributeur majeur de PHP et responsable releases, a fait la fermeture de la SymfonyLive avec un talk sur les optimisations de performances de PHP 7. Cette nouvelle version est le fruit d’une réécriture totale du code, comprenant la gestion des variables et du garbage collector, qui a permis le gain de performance de ~50% par rapport à PHP 5.6.

Julien nous a présenté diverses optimisations offertes par PHP 7, nous a parlé de la fin de PHP 5.6 et des prochaines versions de PHP.

 

Des HashTables pour tous

La gestion des tableaux avec des clés de type entier a été revue pour offrir les performances d’une hashtable, voici les conditions pour bénéficier de cette optimisation cachée :

  • Les clés du tableau doivent être des entiers
  • L’insertion dans le tableau doit être faite avec des clés d’ordre croissant
  • Pas de suppression possible

En retour vous bénéficierez :

  • d’un accès extrêmement rapide en itératif (des sections de tableau sont mises en cache processeur en conservant l’ordre des données, d'où l’accès itératif accéléré)
  • d’un gain d’utilisation mémoire

Si vous insérez une clé d’un autre type tel qu’une chaîne de caractère ou que vous supprimez un index au milieu de votre tableau, votre tableau redeviendra un tableau PHP classique tel que vous les connaissez.

On notera l’arrivée de ds (Data Structures) qui offrent quelques implémentations de collection classique en PHP 7.0 avec des gains de performances importants.

Source : https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd

 

Une meilleure gestion des chaînes de caractères

Depuis PHP 4, les chaînes de caractères sont immuables. Cette caractéristique a permis d’implémenter en PHP7 une gestion qui permet d’éviter la duplication des types string en mémoire, désormais si vous déclarez 50 variables d’une chaîne de caractères “foo”, vous aurez 50 pointeurs vers la même instance string.

Une optimisation de la configuration de OPCache accompagne cette optimisation, en effet le paramètre interned_strings_buffer (par défaut défini sur 4 Mo) représente la quantité de mémoire allouée pour stocker les chaînes de caractères. Julien nous apprend que cette valeur est largement sous-évaluée et nous conseille de passer à 32 Mo ou 64 Mo de mémoire, tout en nous précisant qu’il serait sage de faire un benchmark sur ce paramètre.

 

Le retour du rythme de croisière des releases

PHP 7.0 annonce le retour de releases à un rythme annuel. La version 7.1 annoncera aussi la dépréciation de certaines bibliothèques comme mcrypt (qui n’est plus maintenue depuis 2007).

Le support actif de PHP 5.6 a cessé le 19 janvier ; Attention, le support de sécurité qui est toujours valable ne concerne que les problèmes de sécurité critiques. Julien nous fait bien comprendre que le monde se porterait mieux si tout le monde abandonnait PHP 5 dès à présent !

N’oubliez pas que PHP 8 devrait bénéficier de la branche expérimentale JIT qui apporte un nouveau gain de performance semblable à celui de PHP 7 sur PHP 5.6 !

Evolution des performances PHP
Source : https://www.phpclasses.org/blog/post/493-php-performance-evolution.html

Ce qui reste à venir

PHP 7.x a permis d’introduire beaucoup de choses qui permettront de nouvelles optimisations et de retirer des bibliothèques dépréciées. On remarquera que PHP comme Symfony ont adopté une politique permettant aux développeurs d’éviter un problème de Backward Compatibility lors d’un passage d’une version majeure grâce à des messages “deprecated”.

Le typage statique apparu en PHP 7.0 et complété en PHP 7.1 n’est pas encore utile pour les performances, même si il permet déjà une meilleur qualité et documentation du code, apportant un gain de productivité avec un IDE. Il ne faudra pas attendre de gains de performance venant du typage avant PHP 8.

Quant aux fonctions et bibliothèques dépréciées en PHP 7, elles seront supprimées au passage de la version 8, un bon argument pour rester à jour et effectuer le travail de migration sans douleur !

 

Une parenthèse sur les Threads

PHP n’offre pas de gestion native des threads, néanmoins pour palier certains besoins, Joe Watkins, PHP Core Développeur, a créé la bibliothèque ext/pthread pour permettre la création et la manipulation de threads. Toutefois Julien Pauli nous rappellera que si le besoin de threads se fait sentir, il est peut être nécessaire de revoir votre design ou le langage à utiliser !

 

Conclusion

L’arrivée de PHP 7 avec son gain de performance n’est qu’un début, si la reprise du rythme de sortie d’une release par an reste à confirmer, les message reçus en ce sens sont encourageants.

Au vu de gains de performances qu’il reste possible d’obtenir dans les futures versions de PHP, il est important de prendre la main sur les versions PHP utilisées dans nos environnements de développement et de production, de faire évoluer nos projets à chaque nouvelle version PHP pour les maintenir vierges de toute fonction dépréciée, et ainsi se garantir des migrations vers de meilleures performances sans douleur. Un nouvel argument pour des projets bénéficiant des vraies couvertures de tests.

 

Thibaut Cholley

Ajouter un commentaire