Comment puis-je améliorer les performances des applications ASP.NET MVC?

Comment améliorez-vous les performances de votre application ASP.NET MVC?

Vous trouverez ci-dessous une liste compilée des sources d’amélioration possibles:

Général

  • Utilisez un profileur pour détecter les memory leaks et les problèmes de performances dans votre application. Personnellement, je suggère dotTrace
  • Exécutez votre site en mode Libération, pas en mode Débogage, lors de la production, ainsi que lors du profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode de débogage peut masquer des problèmes de performance dans votre propre code.

Mise en cache

  • Utilisez ComstackdQuery.Comstack() éviter la recompilation de vos expressions
  • OutputCacheAtsortingbute en OutputCacheAtsortingbute contenu non sujet à changement à l’aide de OutputCacheAtsortingbute pour enregistrer les exécutions inutiles et les actions
  • Utilisez des cookies pour accéder aux informations non sensibles fréquemment consultées
  • Utiliser ETags et expiration – Ecrivez vos méthodes ActionResult personnalisées si nécessaire
  • Envisagez d’utiliser le RouteName pour organiser vos itinéraires, puis utilisez-le pour générer vos liens et essayez de ne pas utiliser la méthode ActionLink basée sur l’arborescence des expressions.
  • Envisagez d’implémenter une stratégie de mise en cache de résolution d’itinéraire
  • Placez du code répétitif dans vos PartialViews , évitez de le rendre xxxx fois: si vous PartialViews par appeler le même 300 fois partiel dans la même vue, il y a probablement quelque chose qui ne va pas. Explication Et Repères

Le routage

  • Utilisez Url.RouteUrl("User", new { username = "joeuser" }) pour spécifier les routes. ASP.NET MVC Perfomance de Rudi Benkovic

  • Résolution du cache en utilisant cette aide UrlHelperCached ASP.NET MVC Perfomance de Rudi Benkovic

Sécurité

  • Utiliser l’authentification par formulaire, conservez vos données sensibles fréquemment consultées dans le ticket d’authentification

DAL

  • Lorsque vous accédez à des données via LINQ , utilisez IQueryable
  • Utiliser le modèle de référentiel
  • Profil de vos requêtes, à savoir Uber Profiler
  • Considérez le cache de second niveau pour vos requêtes et ajoutez-leur une scope et un délai, par exemple NHibernate Second Cache.

L’équilibrage de charge

  • Utilisez des proxys inversés pour répartir la charge du client sur votre instance d’application. (Stack Overflow utilise HAProxy ( MSDN )).

  • Utilisez des contrôleurs asynchrones pour mettre en œuvre des actions qui dépendent du traitement des ressources externes.

Côté client

  • Optimisez votre côté client, utilisez un outil tel que YSlow pour des suggestions visant à améliorer les performances
  • Utilisez AJAX pour mettre à jour les composants de votre interface utilisateur, évitez toute mise à jour de la page lorsque cela est possible.
  • Considérez la mise en œuvre d’un pub-sub architecture -ie Comet- pour la livraison de contenu contre le rechargement en fonction des délais d’attente.
  • Déplacer la logique de création de graphiques et de graphiques vers le côté client si possible. La génération de graphiques est une activité coûteuse. En reportant votre serveur du côté inutile de votre serveur, vous pouvez travailler avec des graphes localement sans créer de nouvelle requête (par exemple, graphique Flex, jqbargraph , MoreJqueryCharts ).
  • Utiliser les CDN pour les scripts et le contenu multimédia afin d’améliorer le chargement côté client (c.-à-d. Google CDN )
  • Minify – Comstack – votre JavaScript afin d’améliorer la taille de votre script
  • Conservez une taille de cookie réduite, car les cookies sont envoyés au serveur à chaque demande.
  • Envisagez d’utiliser le DNS et la prélecture de liens lorsque cela est possible.

Configuration globale

  • Si vous utilisez Razor, ajoutez le code suivant dans votre fichier global.asax.cs, par défaut, Asp.Net MVC rend avec un moteur aspx et un moteur de razor. Cela n’utilise que RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Ajoutez gzip (compression HTTP) et cache statique (images, css, …) dans votre web.config

  • Supprimer les modules HTTP inutilisés
  • Videz votre HTML dès qu’il est généré (dans votre web.config) et désactivez viewstate si vous ne l’utilisez pas.

Code Climber et cette entrée de blog fournissent des moyens détaillés d’augmenter les performances de l’application.

Une requête compilée augmentera les performances de votre application, mais elle n’a rien de commun avec ASP.NET MVC. Cela accélérera chaque application de firebase database, il ne s’agit donc pas vraiment de MVC.

La suggestion de base est de suivre les principes REST et les points suivants lient certains de ces principes au framework ASP.NET MVC:

  1. Rendez vos contrôleurs sans état – c’est plutôt une suggestion de «performances / évolutivité Web » (par opposition aux performances au niveau micro / machine) et une décision de conception majeure qui affecterait l’avenir de vos applications – en particulier si elle devient populaire ou tolérance aux pannes par exemple.
    • Ne pas utiliser les sessions
    • N’utilisez pas tempdata – qui utilise des sessions
    • N’essayez pas de tout «mettre en cache» prématurément.
  2. Utiliser l’ authentification par formulaire
    • Conservez vos données sensibles fréquemment consultées dans le ticket d’authentification
  3. Utilisez des cookies pour accéder aux informations non sensibles fréquemment consultées
  4. Rendez vos ressources accessibles sur le Web
    • Utiliser les ETags
    • Utiliser expiration
    • Écrivez vos classes ActionResult personnalisées si nécessaire
    • Utiliser des proxys inversés
  5. Comstackz votre JavaScript. Il y a aussi la bibliothèque de compilation de Closure pour le faire (bien sûr, il y en a d’autres, recherchez simplement ‘JavaScript comstackr’ )
  6. Utilisez les CDN (Content Delivery Network) – en particulier pour vos gros fichiers multimédias, etc.
  7. Envisagez différents types de stockage pour vos données, par exemple, les fichiers, les magasins de clés / valeur, etc. – pas seulement SQL Server
  8. Last but not least, testez votre site Web pour la performance

Cela peut sembler évident, mais exécutez votre site en mode Libération, pas en mode Débogage, lors de la production, ainsi que lors du profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode de débogage peut masquer des problèmes de performance dans votre propre code.

Lors de l’access aux données via LINQ, faites confiance à IQueryable …

Pourquoi utiliser AsQueryable () au lieu de List ()?

… et utiliser un bon modèle de référentiel:

Chargement de sous-registres dans le modèle de référentiel

Cela optimisera l’access aux données pour garantir que seules les données nécessaires sont chargées et que seules celles-ci sont nécessaires.

Pas une optimisation époustouflante, mais je pensais lancer ça – Utilisez les CDN pour jQuery, etc.

Citation de ScottGu lui-même: Le CDN Microsoft Ajax vous permet d’améliorer considérablement les performances des applications Web Forms ASP.NET et ASP.NET MVC qui utilisent ASP.NET AJAX ou jQuery. Le service est disponible gratuitement, ne nécessite aucune inscription et peut être utilisé à des fins commerciales et non commerciales.

Nous utilisons même le CDN pour nos webparts dans Moss qui utilisent jQuery.

De plus, si vous utilisez NHibernate, vous pouvez activer et configurer le cache de second niveau pour les requêtes et append à la scope et au délai des requêtes. Et il y a le profileur de coup de pied pour EF , L2S et NHibernate – http://hibernatingrhinos.com/products/UberProf . Cela aidera à ajuster vos requêtes.

Je vais aussi append:

  1. Utilisez les sprites : les sprites sont une bonne chose pour réduire une requête. Vous fusionnez toutes vos images en une seule et utilisez CSS pour accéder à une bonne partie de l’image-object. Microsoft fournit une bonne bibliothèque pour le faire: Prévisualisation de Sprite et Image Optimization 4 .

  2. Cache Votre object serveur : Si vous avez des listes de références ou des données qui changent rarement, vous pouvez les mettre en mémoire cache au lieu d’interroger la firebase database à chaque fois.

  3. Utilisez ADO.NET au lieu d’Entity Framework : EF4 or EF5 sont parfaits pour réduire le temps de développement, mais il sera difficile de l’optimiser. Il est plus simple d’optimiser une procédure stockée que Entity Framework. Donc, vous devriez utiliser les procédures de magasin autant que possible. Dapper fournit un moyen simple d’interroger et de mapper le SQL avec de très bonnes performances.

  4. Page de cache ou page partielle : MVC fournit un filtre simple pour mettre en cache la page en fonction de certains parameters, donc utilisez-la.

  5. Réduire les appels à la firebase database : vous pouvez créer une demande de firebase database unique qui renvoie plusieurs objects. Vérifiez sur le site Web de Dapper.

  6. Ayez toujours une architecture propre : utilisez une architecture n-tiers propre, même sur un petit projet. Cela vous aidera à garder votre code propre et il sera plus facile de l’optimiser si nécessaire.

  7. Vous pouvez consulter ce modèle ” Neos-SDI MVC Template ” qui créera une architecture propre avec de nombreuses améliorations de performances par défaut (consultez le site Web MvcTemplate ).

En plus de toutes les informations utiles sur l’optimisation de votre application côté serveur, je vous conseille de consulter YSlow . C’est une excellente ressource pour améliorer les performances du site du côté client.

Cela s’applique à tous les sites, pas seulement à ASP.NET MVC.

Une chose très facile à faire est de penser de manière asynchrone lors de l’access aux données souhaitées pour la page. Que vous lisiez un service Web, un fichier, une firebase database ou autre, utilisez le modèle asynchrone autant que possible. Même si cela n’aidera pas nécessairement une page plus rapidement, cela aidera votre serveur à obtenir de meilleurs résultats.

1: Obtenir des timings. Tant que vous ne savez pas où est le ralentissement, la question est trop large pour y répondre. Un projet sur lequel je travaille a ce problème précis; Il n’y a pas de journalisation pour savoir combien de temps certaines choses prennent; nous ne pouvons que deviner les parties lentes de l’application jusqu’à ce que nous ajoutions des délais au projet.

2: Si vous avez des opérations séquentielles, n’ayez pas peur de multithreader légèrement. EN PARTICULIER si des opérations de blocage sont en cause. PLINQ est votre ami ici.

3: Pregenerate vos vues MVC lors de la publication … Cela vous aidera dans certains cas

4: Certains défendent les avantages de la procédure stockée / ADO de la vitesse. D’autres préconisent la rapidité de développement de l’EF et une séparation plus claire des niveaux et de leurs objectives. J’ai vu des conceptions très lentes lorsque SQL et les solutions de contournement pour utiliser Sprocs / Views pour la récupération et le stockage des données. En outre, votre difficulté à tester augmente. Notre base de code actuelle que nous convertissons d’ADO à EF ne fonctionne pas moins bien (et dans certains cas mieux) que l’ancien modèle roulé à la main.

5: Cela dit, pensez à l’application Warmup. Une partie de ce que nous faisons pour aider à éliminer la plupart de nos problèmes de performance EF était d’append une méthode d’échauffement spéciale. Il ne pré-comstack aucune requête ni rien, mais cela aide beaucoup de chargement / génération de métadonnées. Cela peut être encore plus important avec les modèles Code First.

6: Comme d’autres l’ont dit, n’utilisez pas l’état de session ou ViewState si possible. Ce ne sont pas nécessairement des optimisations de performance auxquelles les développeurs pensent, mais une fois que vous commencez à écrire des applications Web plus complexes, vous voulez une réactivité. L’état de la session empêche cela. Imaginez une requête longue. Vous décidez d’ouvrir une nouvelle fenêtre et d’essayer une autre moins complexe. Eh bien, vous avez peut-être aussi attendu l’état de session car le serveur attendra que la première requête soit terminée avant de passer à la suivante pour cette session.

7: minimiser les allers-retours à la firebase database. Enregistrez les éléments que vous utilisez fréquemment, mais ne changera pas de manière réaliste pour votre cache .Net. Essayez de regrouper vos insertions / mises à jour si possible.

7.1: Évitez le code d’access aux données dans vos vues de razor sans raison valable. Je ne dirais pas ça si je ne l’avais pas vu. Ils avaient déjà access à leurs données lors de la mise en place du modèle, pourquoi ne l’avaient-ils pas inclus dans le modèle?

Je voulais juste append mes 2 cents. Le moyen le plus efficace d’optimiser la génération d’itinéraires d’URL dans une application MVC est de ne pas les générer du tout.

La plupart d’entre nous savent plus ou moins comment les URL sont générées dans nos applications de toute façon, aussi simplement en utilisant Url.Content("~/Blahblah") statique Url.Content("~/Blahblah") au lieu de Url.Action() ou Url.RouteUrl() si possible, bat toutes les autres méthodes par presque 20 fois et même plus.

PS J’ai couru un benchmark de quelques milliers d’itérations et publié des résultats sur mon blog si cela vous intéresse.

Dans votre souhait d’optimiser le côté client, n’oubliez pas la couche de firebase database. Nous avons eu une application qui est passée de 5 secondes à charger jusqu’à 50 secondes du jour au lendemain.

Lors de l’inspection, nous avons effectué toute une série de changements de schéma. Une fois que nous avons rafraîchi les statistiques, elles sont soudainement devenues aussi réactives qu’auparavant.

  1. Implémenter Gzip.
  2. Utilisez le rendu asynchrone pour les vues partielles.
  3. Minimiser les hits de la firebase database.
  4. Utilisez une requête compilée.
  5. Exécutez un profileur et recherchez des hits inutiles. Optimisez toutes les procédures stockées qui prennent plus d’une seconde pour renvoyer une réponse.
  6. Utilisez la mise en cache.
  7. Utiliser l’optimisation de la minification groupée .
  8. Utilisez les utilitaires HTML 5 comme le cache de session et le stockage local pour les contenus en lecture seule.

Voici les choses à faire

  1. Cache du mode kernel
  2. Mode pipeline
  3. Supprimer les modules inutilisés
  4. runAllManagedModulesForAllRequests
  5. Ne pas écrire dans wwwroot
  6. Supprimer les moteurs de vue et la langue inutilisés

L’utilisation du regroupement et de la minification vous aide également à améliorer les performances. Cela réduit fondamentalement le temps de chargement de la page.