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
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
4.2.5 Performances<br />
Les questions <strong>de</strong> performance sont toujours à gar<strong>de</strong>r à l’œil lorsque mapping il y a. En effet, le<br />
mapping n’est jamais qu’une ou plusieurs couches insérées dans une pile parfois déjà conséquente.<br />
La performance n’est pas toujours facile à cerner, en revanche. Nous pouvons d’ores et déjà parler<br />
<strong>de</strong> performances exprimées en temps développeurs car nous avons vu ce qu’il en était <strong>de</strong> la syntaxe<br />
et <strong>de</strong> la simplicité <strong>de</strong> mise en œuvre. Le travail est plus rapi<strong>de</strong> et moins porteur d’erreurs ([1] utilise<br />
les termes <strong>de</strong> « less error prone » pour désigner le développement avec <strong>Linq</strong> to Sql). Si le temps <strong>de</strong><br />
mise en œuvre est réduit par rapport à une approche ADO.NET qu’en est-il <strong>de</strong> la qualité ? Les co<strong>de</strong>s<br />
auto-générés sont souvent pointés du doigt dans ce domaine. Et les temps <strong>de</strong> réponses, seront-ils<br />
satisfaisant ? Nous allons réaliser plusieurs tests afin <strong>de</strong> nous forger notre propre opinion.<br />
4.2.5.1 Test d’insertions<br />
Nous allons ici envisager un scénario très simple, à savoir une succession d’insertions dans une table<br />
relationnelle vierge. Nous mettrons en compétition une version <strong>Linq</strong> to Sql avec une version<br />
ADO.NET. Les requêtes seront groupées ainsi que le ferait une application avec base <strong>de</strong> données<br />
locale, dans un but <strong>de</strong> réduction du nombre d’accès disques. La situation est exprimée ci-<strong>de</strong>ssous en<br />
pseudo co<strong>de</strong> :<br />
DateTime star t = now ; //start pour le test 1<br />
for(int i=1 ; i < nbrOps ; ++i)<br />
{<br />
requete.ajout(insertion unitaire);<br />
}<br />
requete.Execute() ;<br />
DateTime end = now ; //Ecart = end – start<br />
Les co<strong>de</strong>s utilisés lors <strong>de</strong> ce test sont disponibles en annexe (Annexe 2 : co<strong>de</strong>s <strong>de</strong> tests <strong>de</strong><br />
performances pour <strong>Linq</strong> to Sql). Après plusieurs exécutions <strong>de</strong> la version <strong>Linq</strong> pour un même nombre<br />
d’opérations, un phénomène curieux apparaît. Cette version est plus lente à la première exécution<br />
du test, et les temps <strong>de</strong> réponses se stabilisent dès la <strong>de</strong>uxième exécution du test. C’est assez<br />
inattendu et rien, à ce sta<strong>de</strong> <strong>de</strong> notre étu<strong>de</strong>, ne semble pouvoir justifier cela. [1] nous apprend que le<br />
DataContext rassemble toutes les informations nécessaires au mapping lors <strong>de</strong> sa première<br />
utilisation. Le mapping est gardé en mémoire jusqu’à son remplacement par un autre mapping ou<br />
jusqu’à la fermeture <strong>de</strong> Visual Studio. Le gain <strong>de</strong> temps observé varie entre quelques dixièmes à <strong>de</strong>ux<br />
secon<strong>de</strong>s, quel que soit le nombre d’opérations <strong>de</strong>mandées par la suite. Pour revenir à notre test,<br />
nous pouvons désormais comparer la version ADO.NET aux <strong>de</strong>ux temps <strong>de</strong> réponse <strong>de</strong> la version<br />
<strong>Linq</strong>. De manière surprenante, la version <strong>Linq</strong> a été observée comme étant plus rapi<strong>de</strong> pour ses <strong>de</strong>ux<br />
temps <strong>de</strong> réponse. Ceci semble aller contre toute la logique du mapping et en réalité, c’est là qu’un<br />
examen plus approfondi du co<strong>de</strong> permettra <strong>de</strong> dénicher l’astuce. Pour ce premier test, la version<br />
ADO.NET a été construite <strong>de</strong> manière très naïve. La requête étant représenté par un string, celui-ci<br />
est modifié à chaque tour <strong>de</strong> boucle pour représenter une requête <strong>de</strong> plus en plus longue. La<br />
manipulation <strong>de</strong> ce string en mémoire va entraîner un nombre d’opérations responsables <strong>de</strong><br />
l’accumulation <strong>de</strong> ce retard. Notons déjà ici une <strong>de</strong>s forces <strong>de</strong> <strong>Linq</strong> to Sql qui est <strong>de</strong> réaliser<br />
l’optimisation pour le programmeur alors que la version ADO.NET peut fonctionner en étant très mal<br />
programmée. En ne considérant que les temps d’accès à la base <strong>de</strong> données, la version ADO.NET<br />
s’est montrée plus rapi<strong>de</strong>, ce qui était beaucoup plus prévisible. Le temps d’exécution nécessaire<br />
varie presque du simple au double entre les <strong>de</strong>ux approches dans ces conditions. Ces temps varient<br />
linéairement avec le nombre d’opérations à effectuer. L’ergonomie et la productivité du développeur