Le blog de Noël GUILBERT

Aller au contenu Aller au menu

jeudi, avril 22 2010

Doctrine : DQL Callbacks et performances

La documentation de Doctrine indique que l'utilisation des DQL Callbacks a un impact sur les performances:

The DQL callbacks are off by default due to them costing a little extra.

Et aujourd'hui, un client m'a bien évidemment dit :

Oui, mais combien ?

j'ai donc fait quelques métriques sur un projet symfony afin d'étudier l'impact des "DQL Callbacks" sur les performances de l'application.

La méthode est la suivante :

  1. Effectuer les benchmark suivant : DQL callbacks désactivés, DQL Callbacks activés, DQL Callback activés + DQL Callback activé + Cache de requêtes activé
  2. Dans un 1er temps, effectuer des benchmarks sur une base de donnée vide, afin d'avoir l'impact de cette fonctionnalité sur l'exécution de la requêtes : on évite ainsi le processus d'hydratation.
  3. Dans un second temps, effectuer la même batterie de tests sur une base de donnée contenant une vingtaine d'enregistrement, afin de se rapprocher d'un cas concret.

Voici le code qui m'a permis de réaliser les benchmarks :

$time = microtime(true);
for ($i = 0; $i < 1000; $i++)
{
  Doctrine_Core::getTable('Bookmarks')->findAll();
}

echo microtime(true) - $time, "\n";

C'est relativement simple, il s'agit de lancer 1000 fois la même requête.

Les premiers tests, avec la base vide, m'ont donnés les résultats suivants

RAW  | DQL CALLBACKS | DQL+Cache
--------------------------------
1000 | 1000          | 1000
2,5s | 4s            | 2,7s

Comme vous le constatez, le surcoût est de quasiment 50%, ce qui est loin d'être négligeable. Cependant, une fois le cache de requêtes activé, c'est plutôt raisonnable.

Les seconds tests m'ont donné les résultats suivants

RAW  | DQL CALLBACKS | DQL+Cache
--------------------------------
1000 | 1000          | 1000
9,3s | 10,9s         | 9,3s

Dans cette configuration, l'impact est nettement moindre, de l'ordre de 15%. Cela est du au processus d'hydratation qui est particulièrement coûteux en temps. Et encore une fois, dès que l'on active le cache de requêtes, le performances sont meilleures, et même identiques dans mon cas.

Conclusion

Utilisez le cache de requêtes si vous voulez utiliser les DQL Callbacks.

Note: Tests effectués avec Doctrine 1.2 et PHP 5.3

mercredi, avril 7 2010

Deux conférences sur Symfony 2 aux RMLL 2010

RMLL2010

J'ai le plaisir de vous annoncer que j'animerai deux conférences sur Symfony 2 aux RMLL 2010, qui se déroulent à Bordeaux en Juillet :

Pour plus d'infos sur les RMLL, c'est par ici : http://2010.rmll.info/

jeudi, février 25 2010

Vérifier la valeur d'un champ dans un test fonctionnel

Si vous souhaitez tester la valeur d'un champ de formulaire dans un test fonctionnel avec symfony, voila la méthode:

$browser
  ->checkElement('input[id="site_name"][value=www.mondomaine.com]', true)->

Bien sûr, si vous en avez une plus simple, je suis preneur.

- page 1 de 7