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

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

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

Saved successfully!

Ooh no, something went wrong!