Recherche sur le blog

lundi 31 janvier 2011

[Web] PHP & Zend : Benchmark PDO vs Doctrine

Attardons-nous encore un moment dans les bases de données avec ce test de performances semblable au précédent, qui avait été réalisé durant mon travail de fin d'études (qui, au passage, a été écrit en anglais et en collaboration avec un ami). Ceci est un comparatif qui met face-à-face le PDO intégré à Zend Framework et Doctrine ORM.

Au début nous utilisions la méthode "select" du PDO mais nous avons bien sûr essayé la fonction qui exécute directement les requêtes codées en SQL (méthode "query", toujours fournie par Zend). Par la suite nous avons découvert l'ORM (Object Relational Mapper) répondant doux nom de "Doctrine", et nous nous sommes posé la question de savoir quel était le moyen le plus rapide pour l'exécution d'une requête. De plus, pour tester de manière plus approfondie, nous avons aussi manipulé le "DQL" qui signifie Doctrine Query Language, et dont la syntaxe ressemble vaguement à celle de la méthode "select" en Zend brièvement décrite ci-dessus.

Afin de comparer les différentes techniques, nous avons imaginé 4 scénarios :
  • Sélection de dix enregistrements.
  • Sélection de cent enregistrements.
  • Sélection de mille enregistrements.
  • Mise à jour d'un enregistrement au hasard parmi les enregistrements existants.
Dans notre cas les tests ont été effectués directement depuis le serveur (puisque le PHP est un langage qui s'exécute côté serveur). Ce serveur étant situé à Paderborn, en Allemagne. Puisque celui-ci est distant et que nous n'avions aucun contrôle, les valeurs pouvaient changer d'heure en heure selon les threads et autres tâches qui étaient en exécution. C'est pourquoi nous avons pris nos valeurs à différents moments de la journée, pour nous assurer de leur cohérence. Voici en complément la configuration matérielle de l'environnement:

Point de vue matériel: 
  • QEMU Virtual CPU version 0.11.0 à une fréquence de 2793.225 MHz avec2048 KB de cache. 
  • RAM virtuelle de 512 MB QEMU.
  • Harddisk version 0.11.0 QEMU.
Point de vue logiciel:
  • Apache/2.2.8 (Ubuntu) DAV/2.
  • SVN/1.4.6.
  • mod_python/3.3.1.
  • Python/2.5.2.
  • PHP/5.3.3-dev with eAccelerator 0.9.6-rc1.
  • MySQL version5.1.45-0.dotdeb.0.
Fonction de calcul du temps entre deux points

La fonction microtime en PHP permet de récupérer le temps en millisecondes. Ainsi, en exécutant la fonction avant et après, il est possible d'obtenir une valeur A et une valeur B. On soustrait A de B, pour obtenir C, qui est le temps d'exécution en millisecondes.

Tests effectués
  • Requête SQL avec l'adaptateur PDO.
  • Fonctions “Select” et “update” de Zend.
  • Requête DQL avec Doctrine 1.2.2.
  • Mapping d'objet avec Doctrine 1.2.2.
Les enregistrements présents dans la table ont tous le même contenu, avec une seule clé primaire (un ID). On a un entier comme clé primaire, un autre champ entier, un champ texte et un champ de type timestamp. La base de données est de type MySQL. Les temps seront, comme vous vous en doutez, exprimés en millisecondes.

Graphique global


Les plus petites valeurs sont les meilleures, cela s'entend. La première chose que l'on peut constater est que, tout en tenant compte des conditions de test et de la méthode employée pour réaliser celui-ci, Doctrine semble être le plus lent pour tout. Cela peut probablement provenir du fait qu'il y a deux couches qui viennent se rajouter au traditionnel PDO (qui est l'API de base pour interagir avec la base de données).

On peut effectivement lire dans la documentation officielle qu'il y a premièrement une couche appelée "Doctrine ORM" (la plus haute sur le schéma), chargée de créer un pont entre le modèle relationnel et le modèle objet. Sous celle-ci, on retrouve aussi la couche d'administration qui complète et étend la couche basique d'abstraction définie par le PDO.

Pour vous donner une idée de ce que cela peut donner lors d'une mise à jour, voici un graphique reprenant les moyennes de toutes les valeurs retenues, et ce pour les 4 techniques :


En conclusion, l'utilisation d'un ORM facilite grandement la tâche au développeur (puisque l'écriture des requêtes est simplifiée) mais risque de ralentir l'exécution de votre application web lorsque le nombre d'enregistrements est conséquent. Les créateurs de Doctrine promettaient une rapidité accrue avec la version 2, mais je n'ai pas encore eu l'occasion de la tester. Un jour, peut-être?

Références vers cet article :

Aucun commentaire: