Celles et ceux qui ont suivi, de près ou de loin, la phase de maturation de PHP 5 connaissent de longue date ses très nombreux apports fonctionnels : nouveau moteur Zend Engine 2, nouvelle implémentation objet, nouvelles extensions SimpleXML, SQLite, SOAP pour ne citer qu'elles, etc. Mais on dit aussi PHP 5 plus performant. La publication officielle de PHP 5.0.0 est l'occasion idéale de s'intéresser d'un peu plus près à ses performances. PHP 5 est-il plus véloce que PHP 4 ? Que vaut le Zend Engine 2.0.0 comparé à la version 1.3.0 qui anime PHP 4.3.8 ?

Afin d'avoir un début de réponse à ces questions, j'ai commencé par tenter de compiler PHP 5.0.0 et PHP 4.3.8 avec un minimum d'extension. L'idée était d'obtenir un parseur PHP utilisable en ligne de commande (CLI) mais volontairement dépouillé de tout ce qui ne me servirait pas pour la suite de mes tests (support MySQL, XML, PCRE, Posix, etc.). Cela allait également me permettre de comparer la taille des binaires.

Voici les paramètrages que j'ai utilisé :

Pour PHP 4.3.8 :

'./configure' '--without-apache' '--without-mysql' '--disable-xml' '--disable-session' '--disable-tokenizer' '--disable-posix' '--without-pcre-regex' '--disable-memory-limit' '--disable-debug' '--without-pear' '--enable-bcmath'

Pour PHP 5.0.0 :

'./configure' '--without-apache' '--without-mysql' '--disable-xml' '--disable-session' '--disable-tokenizer' '--disable-posix' '--without-pcre-regex' '--disable-memory-limit' '--disable-debug' '--disable-dom' '--without-sqlite' '--disable-simplexml' '--disable-libxml' '--without-iconv'  '--without-pear' '--enable-bcmath'

Première constatation, du domaine du détail, afin de tendre vers une configuration à peu près similaire entre PHP 4 et PHP 5, un certain nombre d'extensions (principalement nouvelles) comme SQLite et SimpleXML, doivent être desactivées à la compilation de PHP 5. Le cas échéant, elles sont embarquées par défaut.

Intéressons nous maintenant à la taille des binaires :

armel@chrome:~/webbench$ ls -al php*
-rwxr-xr-x    1 armel    users     <b>2489077</b> Jul 14 07:14 php4.3.8*
-rwxr-xr-x    1 armel    users     <b>3532569</b> Jul 14 07:37 php5.0.0*

Seconde constation, déjà moins anecdotique, PHP 5 commence à souffrir de problème de poids. A périmètre fonctionnel similaire, le binaire de PHP 5 est 50% plus volumineux que celui de PHP 4. Peu importe ? Pas sûr. Imaginons un serveur en production, animé par PHP 4 et quelque peu chargé par des pics de fréquentation même temporaire. Le simple fait de basculer vers PHP 5 pourrait conduire, par exemple, le serveur à swapper plus rapidement, venant du même coup impacter directement les performances de facon très sensible. Prudence donc.

Je me suis ensuite intéressé au bench que propose Sebastian Bergmann. Ce bench repose sur une dizaine de scripts. Ils valent ce qu'ils valent, mais ils permettent d'obtenir des résultats sur des opérations simples (comme la création d'un objet, la création d'un tableau, la manipulation d'entiers et de flottants, etc.). Pour les curieux, c'est en vue de jouer ce bench que j'avais activé le support de bcmath ('--enable-bcmath') et supprimé la limite mémoire ('--disable-memory-limit' ).

Je vous livre ci dessous les résultats obtenus avec les deux binaires de PHP (sous Linux 2.4.18 / Duron @ 1.2 Ghz) :

armel@chrome:~/webbench$ ./run4.3.8.sh 
<b>PHP 4.3.8 (cli)</b> (built: Jul 14 2004 07:12:57)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
  Object Creation: 355867 objects created per second
  Member Access: 618991 member accesses per second
  Method Calls: 315280 method calls per second
  Array Creation: 619955 arrays created per second
  Array Index Access: 414951 array elements accessed by index per second
  Array Key Access: 1182269 array elements accessed by key per second
  Basic FP: 2020359 basic FP operations per second
  Complex FP: 1125081 complex FP operations per second
  Nested Loops (FP): 623407 nested loops per second
  Nested Loops (Int): 615740 nested loops per second

armel@chrome:~/webbench$ ./run5.0.0.sh 
<b>PHP 5.0.0 (cli)</b> (built: Jul 14 2004 07:36:40)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.0, Copyright (c) 1998-2004 Zend Technologies
  Object Creation: 354392 objects created per second
  Member Access: 579198 member accesses per second
  Method Calls: 476392 method calls per second
  Array Creation: 613861 arrays created per second
  Array Index Access: 450115 array elements accessed by index per second
  Array Key Access: 1187817 array elements accessed by key per second
  Basic FP: 2129252 basic FP operations per second
  Complex FP: 1068358 complex FP operations per second
  Nested Loops (FP): 645712 nested loops per second
  Nested Loops (Int): 645265 nested loops per second

Globalement, les performances sont semblables ! Pour avoir joué ce bench régulièrement pendant la phase de développement de PHP 5, je vous dirais que cela n'a pas toujours été le cas. A ce titre, la RC1 de PHP 5 était très rapide. La RC3, quant à elle, affichait des (contre) performances préoccupantes. Celles de PHP 5.0.0 semblent donc s'être stabilisées à un niveau satisfaisant. Mais comparativement à PHP 4.3.8, rien de transcendant pour autant ! La RC1 de PHP 5 s'en sortait vraiment beaucoup mieux que PHP 4.3.5, dernière version stable de l'époque.

Je ne vous cache pas que je suis quelque peu critique (à mon tour :p) vis à vis des scripts que se propose de bencher Sebastian. Ils sont trop _atomique_ et portent donc sur des traitements trop simplistes pour, à mon avis, refleter la vélocité réelle d'un script en production. A ce titre, les scripts de Sebastien se rapprochent un peu du test Bogomips que les habitués de Linux connaissent bien et qui ne reflète en rien les performances réelles d'un processeur (préférer de loin les SpecInt ou SpecFloat pour cela, bien plus réalistes). Néanmoins, cela permet de se faire une première idée.

Alors, PHP 5, plus performant ? Loin de moi l'idée de tirer des conclusions hâtives aux vues de ces premières constatations. En premier lieu, PHP 5 est certainement plein de bonnes choses. C'est indéniable. SimpleXML et SQLite, pour ne citer que ces 2 extensions, en font partie à mes yeux. En second lieu, la branche PHP 5 est encore jeune même si elle bénéficie déjà de nombreux mois de mise au point.

Maintenant et en l'état, plus rapide, c'est déjà moins sûr. Quant à la taille du binaire, à l'image du noyau Linux, PHP deviendrait-il obèse ?