12.07.2013 Views

Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles

Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles

Etude exploratoire de Linq - CoDE - de l'Université libre de Bruxelles

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

4.2.5.2 Test en situation concurrentielle<br />

Le test suivant porte sur un contexte où les connexions sont nombreuses et indépendantes. Pour<br />

simuler cette situation, nous allons simplement imposer au programme <strong>de</strong> ne considérer que <strong>de</strong>s<br />

insertions simples directement transmises à la base <strong>de</strong> données. Comme précé<strong>de</strong>mment, un grand<br />

nombre d’insertions seront effectuées mais cette fois elles seront transmises directement à la base<br />

<strong>de</strong> données sans regroupement. Bien qu’il ne s’agisse pas d’un scénario vraiment réaliste, cela suffira<br />

pour se faire une idée <strong>de</strong>s performances relatives <strong>de</strong> <strong>Linq</strong> et d’une connexion plus traditionnelle.<br />

Le graphique qui suit ce paragraphe montre les temps nécessaires (exprimés en millisecon<strong>de</strong>s) à<br />

l’envoi <strong>de</strong> toutes les requêtes une à une pour les <strong>de</strong>ux métho<strong>de</strong>s, le nombre <strong>de</strong> requêtes <strong>de</strong> chaque<br />

lot étant repris en ordonnée. On voit clairement que la courbe intitulée « <strong>Linq</strong> sequence» croît<br />

exponentiellement avec l’augmentation du nombre <strong>de</strong> requêtes à satisfaire. L’explication principale<br />

en est que <strong>Linq</strong> doit manipuler <strong>de</strong>s objets en mémoire comme nous l’avons vu dans la section<br />

« Opérations fondamentales » <strong>de</strong> ce chapitre, <strong>de</strong>rnier paragraphe. Chaque ajout créé un objet<br />

supplémentaire et cette modification a lieu en mémoire centrale, ce qui sera fait beaucoup plus<br />

rapi<strong>de</strong>ment que l’envoi <strong>de</strong> la requête à la base <strong>de</strong> données. Chaque soumission entraîne l’analyse du<br />

marquage <strong>de</strong> chaque objet, ce qui ralentit l’ensemble du programme. La métho<strong>de</strong> ADO.NET,<br />

représentée par la courbe « ADO sequence », ne manipule pas d’autres objets que les strings utilisés<br />

pour construire les requêtes, celles-ci étant ensuite transmises au gestionnaire <strong>de</strong> la base <strong>de</strong><br />

données. Les temps d’accès varient donc selon une progression linéaire. La troisième courbe<br />

présente sur le graphe représente les temps d’accès correspondant pour une utilisation idéalisée <strong>de</strong><br />

<strong>Linq</strong>. Utilisation idéalisée car l’envoi <strong>de</strong>s requêtes n’est fait qu’au <strong>de</strong>rnier moment, économisant ainsi<br />

sur les temps d’analyse <strong>de</strong> marquages par la sentinelle. L’appel à la fonction SubmitChanges réalise<br />

l’appel à la base <strong>de</strong> données et toutes les entités marquées comme étant « à insérer » vont générer<br />

une requête Sql correspondant à leur insertion. En n’effectuant cette tâche qu’une seule fois, on<br />

aperçoit que le gain <strong>de</strong> temps est conséquent 10 . Dans la réalité pratique, on pourrait regrouper<br />

plusieurs requêtes par petits lots afin d’économiser un peu sur les accès successifs à la base <strong>de</strong><br />

données. Mais un appel unique est impensable, du fait que « la fin » est impossible à prévoir en<br />

pratique ainsi qu’à cause <strong>de</strong>s problèmes d’accès concurrentiels aux données. Les possibilités<br />

d’optimiser <strong>Linq</strong> relèvent principalement <strong>de</strong> la gestion <strong>de</strong>s conflits, <strong>de</strong> la synchronisation et du <strong>de</strong>sign<br />

<strong>de</strong> l’application. Les performances en situation réelles sont certainement moins bonnes que le cas<br />

idéal mais vraisemblablement plus proches <strong>de</strong> cette valeur que <strong>de</strong> celle <strong>de</strong> la version naïve.<br />

10 Cette observation semble n’apparaître nulle part, *4+ le laisse tout juste sous-entendre.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!