{"id":6379,"date":"2022-04-14T16:34:40","date_gmt":"2022-04-14T14:34:40","guid":{"rendered":"https:\/\/www.luklagroup.com\/sem-categoria\/comment-optimiser-les-performances-de-votre-application-web-asp-net\/"},"modified":"2022-04-14T16:34:40","modified_gmt":"2022-04-14T14:34:40","slug":"comment-optimiser-les-performances-de-votre-application-web-asp-net","status":"publish","type":"post","link":"https:\/\/www.luklagroup.com\/pt-pt\/apps-data-pt-pt\/comment-optimiser-les-performances-de-votre-application-web-asp-net\/","title":{"rendered":"Comment optimiser les performances de votre application web ASP.Net ?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong><em>Depuis des ann\u00e9es, je d\u00e9veloppe des applications web bas\u00e9es sur les frameworks<a href=\"https:\/\/dotnet.microsoft.com\/en-us\/apps\/aspnet\" target=\"_blank\" rel=\"noreferrer noopener\"> ASP.Net<\/a>. Et plus r\u00e9cemment avec le framework ASP.Net Core. <\/em><\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><em>Fort de cette exp\u00e9rience, je vais vous pr\u00e9senter, dans une s\u00e9rie d\u2019articles, des pistes d&#8217;optimisation de performances des applications web .Net.<\/em><\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Am\u00e9lioration des applications, avec quels moyens ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ces frameworks ont nettement \u00e9volu\u00e9 depuis la version 2.0<\/strong>. Il est d\u00e9sormais assez simple de d\u00e9marrer un projet \u00e0 partir de l&#8217;<a href=\"https:\/\/visualstudio.microsoft.com\/fr\/\" target=\"_blank\" rel=\"noreferrer noopener\">IDE Visual Studio<\/a> pour r\u00e9pondre \u00e0 une demande client.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Les applications web sont souvent li\u00e9es \u00e0 une ou plusieurs bases de donn\u00e9es (directement, ou indirectement via des APIs). Les versions r\u00e9centes de SQL Server Management Studio permettent aux d\u00e9veloppeurs de &#8220;tuner&#8221; un minimum ces bases afin d&#8217;obtenir des requ\u00eates avec un temps de r\u00e9ponse acceptable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Construire une application web avec un minimum de rendu graphique est donc \u00e0 la port\u00e9e de toute \u00e9quipe de d\u00e9veloppement. Mais, <strong>il est essentiel que les performances de cette application restent optimales au fil des versions d\u00e9ploy\u00e9es<\/strong>. En effet, plus une application \u00e9volue, plus les lenteurs de chargement des \u00e9crans apparaissent. Optimiser les performances d&#8217;une application \u00e0 un certain stade de maturit\u00e9 du projet rel\u00e8ve tr\u00e8s souvent de la gageure !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il est donc important de veiller constamment aux performances de l\u2019application d\u00e8s sa conception. Puis, tout au long de sa r\u00e9alisation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans cette s\u00e9rie d&#8217;articles, je vais \u00e9voquer quelques <strong>astuces<\/strong> utilis\u00e9es durant mes exp\u00e9riences pour <strong>fluidifier la navigation des applications<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La base de donn\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;optimisation d&#8217;une application se fait d\u00e8s le d\u00e9but du projet en commen\u00e7ant par <strong>la base de donn\u00e9es<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le design d&#8217;une base relationnelle suivant de bonnes pratiques est crucial car c&#8217;est par l\u00e0 que tout commence. Avant de se lancer dans la conception du sch\u00e9ma de la base, il est primordial de cataloguer les donn\u00e9es que l&#8217;on va utiliser en sachant que <strong>ce catalogue sera constamment amen\u00e9 \u00e0 \u00e9voluer<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le jeu consiste \u00e0 pouvoir identifier les tables de r\u00e9f\u00e9rence et les tables qui vont contenir les donn\u00e9es. Puis \u00e0 imaginer les appels qui, par l&#8217;interm\u00e9diaire de proc\u00e9dures stock\u00e9es ou bien \u00e0 partir d&#8217;un ORM, vont requ\u00eater l&#8217;ensemble de ces tables. Le tout, en cherchant \u00e0 r\u00e9duire le plus possible les jointures faites entre ces tables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">L&#8217;optimisation c\u00f4t\u00e9 SQL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Analyse du traitement des requ\u00eates avec SQL Server Management Studio<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Il existe des outils simples que le d\u00e9veloppeur utilise tous les jours, comme le <strong>SQL Server Management Studio<\/strong>. Cet outil puissant fournit certaines fonctionnalit\u00e9s tr\u00e8s utiles mais dont beaucoup ignorent l\u2019existence, comme <strong>le plan d&#8217;ex\u00e9cution<\/strong> par exemple. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette fonctionnalit\u00e9 permet d&#8217;analyser la mani\u00e8re dont le moteur SQL va traiter une requ\u00eate pour identifier ses points faibles. Cela aidera le d\u00e9veloppeur \u00e0 r\u00e9\u00e9crire la requ\u00eate pour am\u00e9liorer les temps de r\u00e9ponse, red\u00e9finir les cl\u00e9s, les contraintes ou encore les index des tables.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img alt=\"\" decoding=\"async\" src=\"https:\/\/digiwin.fr\/wp-content\/uploads\/2022\/04\/BD1.png\" alt=\"\" class=\"wp-image-4087\"\/><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL Server Profiler,  un outil de tra\u00e7age performant<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SQL Server Profiler<\/strong> est un autre outil que j\u2019utilise tr\u00e8s souvent pour r\u00e9\u00e9crire les appels faits \u00e0 la base de donn\u00e9es. Je l&#8217;utilise car les applications que je con\u00e7ois sont pratiquement toujours bas\u00e9es sur l&#8217;utilisation d&#8217;un ORM comme <a href=\"https:\/\/docs.microsoft.com\/fr-fr\/ef\/\" target=\"_blank\" rel=\"noreferrer noopener\">Entity Framework<\/a> ou <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Hibernate\" target=\"_blank\" rel=\"noreferrer noopener\">NHibernate<\/a>. Et qui dit ORM, dit requ\u00eate g\u00e9n\u00e9r\u00e9e. C&#8217;est donc du code SQL dont on n\u2019a pas forc\u00e9ment la ma\u00eetrise et qui tr\u00e8s souvent produit un nombre important de jointures.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette interface permet de tracer toutes les requ\u00eates SQL transitant par la base. Cela permet d&#8217;ajuster les projections, de r\u00e9duire le nombre de jointures des requ\u00eates SELECT et d\u2019am\u00e9liorer les temps de r\u00e9ponse.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img alt=\"\" decoding=\"async\" src=\"https:\/\/digiwin.fr\/wp-content\/uploads\/2022\/04\/BD2.png\" alt=\"\" class=\"wp-image-4088\"\/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Mais ces outils permettent seulement de diagnostiquer les probl\u00e8mes de lenteurs, pas de les r\u00e9soudre&nbsp;: il faut un minimum de bon sens lorsque l\u2019on con\u00e7oit une application.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Prenons l\u2019exemple des tables de r\u00e9f\u00e9rence&nbsp;: ces tables contiennent des informations quasi statiques, n\u00e9cessaires au param\u00e9trage du fonctionnement de l\u2019application ou \u00e0 l\u2019enrichissement des donn\u00e9es. Or, une table contenant des codes postaux n\u2019aura pas la m\u00eame cardinalit\u00e9 qu\u2019une table contenant des civilit\u00e9s. Cette derni\u00e8re ne contenant que 2 enregistrements (M, Mme), il n\u2019est pas n\u00e9cessaire de cr\u00e9er une table qui g\u00e9n\u00e9rera forc\u00e9ment des jointures&nbsp;: il est plut\u00f4t pr\u00e9f\u00e9rable de cr\u00e9er une \u00e9num\u00e9ration c\u00f4t\u00e9 code. Pourquoi ? Car cette \u00e9num\u00e9ration n\u2019\u00e9voluera jamais.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La pagination c\u00f4t\u00e9 serveur<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enfin, il y a un dernier sujet que j\u2019aimerais aborder dans cet article et qui concerne les listes pagin\u00e9es. Des biblioth\u00e8ques de <strong>composants<\/strong>, comme <a href=\"https:\/\/www.telerik.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Telerik<\/a>, permettent de faire ceci en 3 clics. C\u2019est un jeu d\u2019enfant !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mais c\u2019est aussi un pi\u00e8ge : la pagination se fait nativement c\u00f4t\u00e9 client et non c\u00f4t\u00e9 serveur. Cela peut passer lorsque le nombre d\u2019enregistrements \u00e0 paginer est faible. En revanche, cela devient un vrai probl\u00e8me lorsque ce nombre devient important.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La bonne pratique consiste \u00e0 mettre en place une <strong>technique de pagination c\u00f4t\u00e9 serveur<\/strong>, et ce, d\u00e8s le d\u00e9but du projet, sachant que ce genre de composant est en g\u00e9n\u00e9ral tr\u00e8s utilis\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a bien s\u00fbr bien d\u2019autres astuces qui permettent d\u2019am\u00e9liorer les temps de r\u00e9ponse des appels faits \u00e0 la base comme <strong>la mise en cache, le param\u00e9trage des ORMs<\/strong>, etc.. Mais c&#8217;est d\u00e9j\u00e0 un d\u00e9but. \ud83d\ude42<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Pour les autres astuces, je les aborderai sur les prochains articles de cette s\u00e9rie ! Le prochain est consacr\u00e9 \u00e0 l\u2019optimisation des performances des applications c\u00f4t\u00e9 code.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Depuis des ann\u00e9es, je d\u00e9veloppe des applications web bas\u00e9es sur les frameworks ASP.Net. Et plus r\u00e9cemment avec le framework ASP.Net Core. Fort de cette exp\u00e9rience, je vais vous pr\u00e9senter, dans une s\u00e9rie d\u2019articles, des pistes d&#8217;optimisation de performances des applications web .Net. Am\u00e9lioration des applications, avec quels moyens ? Ces frameworks ont nettement \u00e9volu\u00e9 depuis [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6380,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"","_seopress_titles_title":"","_seopress_titles_desc":"","_seopress_robots_index":"","footnotes":""},"categories":[183,184,191],"tags":[217,218,219],"class_list":["post-6379","post","type-post","status-publish","format-standard","has-post-thumbnail","category-apps-data-pt-pt","category-change-adopt-pt-pt","category-cloud-cyber-pt-pt","tag-net-pt-pt","tag-framework-pt-pt","tag-sql-pt-pt"],"_links":{"self":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/6379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=6379"}],"version-history":[{"count":0,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/posts\/6379\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media\/6380"}],"wp:attachment":[{"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=6379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=6379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.luklagroup.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=6379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}