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
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.