Comment puis-je améliorer les performances de l'application ASP.NET MVC?

Réponses:

311

Une liste compilée des sources possibles d'amélioration est ci-dessous:

Général

  • Utilisez un profileur pour découvrir les fuites de mémoire et les problèmes de performances dans votre application. personnellement, je suggère dotTrace
  • Exécutez votre site en mode Release, pas en mode Debug, lorsqu'il est en production et également pendant le profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode débogage peut masquer les problèmes de performances dans votre propre code.

Mise en cache

  • Utilisez CompiledQuery.Compile() récursivement en évitant la recompilation de vos expressions de requête
  • Mettre en cache le contenu non susceptible de changer en utilisant OutputCacheAttribute pour enregistrer les exécutions inutiles et les actions
  • Utiliser des cookies pour les informations non sensibles fréquemment consultées
  • Utiliser ETags et expiration - Écrivez vos ActionResultméthodes personnalisées si nécessaire
  • Envisagez d'utiliser le RouteNamepour 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 de mettre en œuvre une stratégie de mise en cache de la résolution des itinéraires
  • Mettez du code répétitif à l'intérieur de votre PartialViews, évitez de le rendre xxxx fois: si vous finissez par appeler le même partiel 300 fois dans la même vue, il y a probablement quelque chose qui ne va pas. Explication et repères

Acheminement

Sécurité

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

DAL

L'équilibrage de charge

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

  • Utilisez des contrôleurs asynchrones pour implémenter des actions qui dépendent du traitement des ressources externes.

Côté client

  • Optimisez votre côté client, utilisez un outil comme YSlow pour des suggestions pour améliorer les performances
  • Utilisez AJAX pour mettre à jour les composants de votre interface utilisateur, évitez une mise à jour de page entière lorsque cela est possible.
  • Envisagez d'implémenter une architecture pub-sub -ie Comet- pour la livraison de contenu contre le rechargement basé sur des délais d'attente.
  • Si possible, déplacez la logique de génération de graphiques et de graphiques du côté client. La génération de graphes est une activité coûteuse. Le report du côté client de votre serveur à partir d'une charge inutile, et vous permet de travailler avec des graphiques localement sans faire de nouvelle demande (par exemple, graphique Flex, jqbargraph , MoreJqueryCharts ).
  • Utilisez les CDN pour les scripts et le contenu multimédia pour améliorer le chargement côté client (par exemple, Google CDN )
  • Minify - Compile - votre JavaScript afin d'améliorer la taille de votre script
  • Gardez la taille des cookies petite, car les cookies sont envoyés au serveur à chaque demande.
  • Pensez à utiliser DNS et Link Prefetching lorsque cela est possible.

Configuration globale

  • Si vous utilisez Razor, ajoutez le code suivant dans votre global.asax.cs, par défaut, Asp.Net MVC effectue le rendu avec un moteur aspx et un moteur razor. Cela utilise uniquement RazorViewEngine.

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

  • Ajoutez gzip (compression HTTP) et cache statique (images, css, ...) dans votre web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Supprimer les modules HTTP inutilisés
  • Videz votre code HTML dès qu'il est généré (dans votre web.config) et désactivez viewstate si vous ne l'utilisez pas <pages buffer="true" enableViewState="false">
SDReyes
la source
6
attendez, vous voulez dire que je perds les performances lorsque, par exemple, j'ai une vue qui affiche un ensemble de résultats en irritant via un IList et en appelant Render.PartialView ("Row", item) pour chaque élément de la liste? combien je perds? ou comment puis-je mesurer le gain de performances?
marc.d
@SDReyes - quel est le sens de l'architecture pub-sub ?
Mohammed Zameer
1
C'est cool. Le lien Uber Profiler est mort cependant. Cela devrait-il être lié à l'un des profileurs spécifiques ORM?
shanabus
12

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

  1. Rendez vos contrôleurs apatrides - c'est plus un ' Web suggestion de ` performances / évolutivité ' (par opposition aux performances au niveau micro / machine) et d'une décision de conception majeure qui affecterait l'avenir de vos applications - en particulier si elle devient populaire ou si vous en avez besoin tolérance aux pannes par exemple.
    • N'utilisez pas les sessions
    • N'utilisez pas tempdata - qui utilise des sessions
    • N'essayez pas de «mettre en cache» tout «prématurément».
  2. Utiliser l' authentification par formulaire
    • Conservez vos données sensibles fréquemment consultées dans le ticket d'authentification
  3. Utiliser des cookies pour les informations non sensibles fréquemment consultées
  4. Rendez vos ressources accessibles sur le Web
  5. Compilez votre JavaScript. Il existe également une bibliothèque de compilateur Closure pour le faire (bien sûr, il y en a d'autres, il suffit de rechercher également le `` compilateur JavaScript '' )
  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 / valeurs, etc. - pas seulement SQL Server
  8. Enfin, testez les performances de votre site Web
ziya
la source
10

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

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

LukLed
la source
8

Cela peut sembler évident, mais exécutez votre site en mode Release, et non en mode Debug, lorsqu'il est en production et également pendant le profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode débogage peut masquer les problèmes de performances dans votre propre code.

Craig Stuntz
la source
6

Pas une optimisation bouleversante, mais je pensais que je jetterais ce là - bas - Utilisez CDN est pour jQuery, etc. .

Citation de ScottGu lui-même: le Microsoft Ajax CDN vous permet d'améliorer considérablement les performances des formulaires Web ASP.NET et des applications MVC ASP.NET 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 composants WebPart dans Moss qui utilisent jQuery.

Ta01
la source
6

Aussi si vous utilisez NHibernate vous pouvez activer et configurer le cache de deuxième niveau pour les requêtes et l'ajouter à la portée et au délai d'expiration des requêtes. Et il existe un profileur kick ass pour EF , L2S et NHibernate - http://hibernatingrhinos.com/products/UberProf . Cela vous aidera à régler vos requêtes.

Peter Mortensen
la source
Ayende a récemment blogué sur la façon dont EF Profiler l'a aidé à régler un exemple d'application MVC: ayende.com/Blog/archive/2010/05/17/…
Frank Schwieterman
5

J'ajouterai également:

  1. Utiliser des sprites : les sprites sont une bonne chose pour réduire une demande. Vous fusionnez toutes vos images en une seule et utilisez CSS pour accéder à une bonne partie du sprite. Microsoft fournit une bonne bibliothèque pour le faire: Sprite et Image Optimization Preview 4 .

  2. Cachez votre objet serveur : si vous avez des listes de références ou des données qui changeront rarement, vous pouvez les mettre en cache au lieu d'interroger la base de données à chaque fois.

  3. Utilisez ADO.NET au lieu d'Entity Framework : EF4 or EF5sont parfaits pour réduire le temps de développement, mais il sera difficile d'optimiser. Il est plus simple d'optimiser un procédure stockée qu'Entity Framework. Vous devez donc utiliser autant que possible les procédures de stockage. Dapper fournit un moyen simple d'interroger et de mapper SQL avec de très bonnes performances.

  4. Page de cache ou page partielle : MVC fournit un filtre facile pour mettre en cache la page en fonction de certains paramètres, alors utilisez-le.

  5. Réduisez les appels à la base de données : vous pouvez créer une demande de base de données unique qui renvoie plusieurs objets. Vérifiez sur le site Web de Dapper.

  6. Ayez toujours une architecture propre : Ayez une propre à n niveaux, 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 jeter un œil à ce modèle " Modèle MVC Neos-SDI " qui créera une architecture propre pour vous avec de nombreuses améliorations de performances par défaut (consultez le site Web MvcTemplate ).

Jeff Lequeux
la source
Pensez-vous qu'il est préférable d'exécuter une procédure stockée qui renvoie plus de jeux de résultats, puis d'exécuter plus de procédures stockées en mode asynchrone?
Muflix
4

En plus de toutes les bonnes informations sur l'optimisation de votre application côté serveur, je dirais que vous devriez jeter un œil à YSlow . C'est une superbe ressource pour améliorer les performances du site côté client.

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

Steve Haigh
la source
3

Une chose super simple à faire est de penser de manière asynchrone lors de l'accès aux données que vous souhaitez pour la page. Que vous lisiez depuis un service Web, un fichier, une base de données ou autre, utilisez autant que possible le modèle asynchrone. Bien que cela n'aidera pas nécessairement une page à être plus rapide, cela aidera votre serveur à mieux fonctionner dans l'ensemble.

Aucun remboursement, aucun retour
la source
2

1: Obtenez les horaires. Jusqu'à ce que vous sachiez où se situe 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 aucune 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 minutages au projet.

2: Si vous avez des opérations séquentielles, n'ayez pas peur de légèrement multithread. SURTOUT si des opérations de blocage sont impliquées. PLINQ est votre ami ici.

3: Pré-générer vos vues MVC lors de la publication ... Cela vous aidera avec certains des `` premiers coups de page ''

4: Certains plaident pour les avantages de la procédure stockée / ADO de la vitesse. D'autres plaident pour la rapidité de développement des FE et une séparation plus claire des niveaux et de leur objectif. 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 de données. De plus, votre difficulté à tester augmente. Notre base de code actuelle que nous convertissons d'ADO en EF ne fonctionne pas moins bien (et dans certains cas mieux) que l'ancien modèle roulé à la main.

5: Cela dit, pensez au préchauffage de l'application. Une partie de ce que nous faisons pour aider à éliminer la plupart de nos problèmes de performance EF était d'ajouter une méthode spéciale de préchauffage. Il ne précompile aucune requête ni rien, mais il aide à une grande partie du chargement / génération des métadonnées. Cela peut être encore plus important lorsqu'il s'agit de modèles Code First.

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

7: Minimisez les allers-retours vers la base de données. Enregistrez les éléments que vous utilisez fréquemment mais qui ne changeront pas de manière réaliste dans votre cache .Net. Essayez de regrouper vos insertions / mises à jour dans la mesure du possible.

7.1: Évitez le code d'accès aux données dans vos vues Razor sans une putain de bonne raison. Je ne dirais pas ça si je ne l'avais pas vu. Ils accédaient déjà à leurs données lors de la création du modèle, pourquoi diable ne l'incluaient-ils pas dans le modèle?

to11mtm
la source
2
  1. Implémentez Gzip.
  2. Utilisez le rendu asynchrone pour les vues partielles.
  3. Minimisez les accès à la base de données.
  4. Utilisez une requête compilée.
  5. Exécutez un profileur et découvrez les 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 la minification de regroupement optimisation de la .
  8. Utilisez les utilitaires HTML 5 comme le cache de session et le stockage local pour le contenu en lecture seule.
Vinayak
la source
2

Je voulais juste ajouter mes 2 cents. Le moyen le plus efficace d'optimiser la génération de routes 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, donc il suffit d'utiliser statique Url.Content("~/Blahblah")au lieu de Url.Action()ouUrl.RouteUrl() si possible, bat toutes les autres méthodes de près de 20 fois et même plus.

PS. J'ai exécuté une référence de quelques milliers d'itérations et publié des résultats sur mon blog si cela m'intéresse.

Alex
la source
1

Dans votre demande d'optimiser le côté client, n'oubliez pas la couche de base de données. Nous avions une application qui passait de 5 secondes à charger jusqu'à 50 secondes pendant la nuit.

Lors de l'inspection, nous avions fait tout un tas de changements de schéma. Une fois que nous avons actualisé les statistiques, elles sont soudainement devenues aussi réactives qu'auparavant.

Robbie Dee
la source
0

Voici les choses à faire

  1. Cache en mode noyau
  2. Mode pipeline
  3. Supprimer les modules inutilisés
  4. runAllManagedModulesForAllRequests
  5. N'écrivez pas sur wwwroot
  6. Supprimez les moteurs de vue et la langue inutilisés
Zahid Mustafa
la source
0

L'utilisation du regroupement et de la minification vous aide également à améliorer les performances. Il réduit essentiellement le temps de chargement des pages.

Neelima
la source
0

Si vous exécutez votre application ASP.NET MVC sur Microsoft Azure (IaaS ou PaaS), procédez comme suit au moins avant le premier déploiement.

  • Scannez votre code avec un analyseur de code statique pour tout type de dette de code, de duplication, de complexité et de sécurité.
  • Activez toujours Application Insight et surveillez fréquemment les performances, les navigateurs et les analyses pour trouver les problèmes en temps réel dans l'application.
  • Implémentez Azure Redis Cache pour les données de changement statiques et moins fréquentes comme les images, les actifs, les mises en page courantes, etc.
  • Comptez toujours sur les outils APM (Application Performance Management) fournis par Azure.
  • Consultez fréquemment le plan de l'application pour étudier les performances de communication entre les parties internes de l'application.
  • Surveillez également les performances de la base de données / VM.
  • Utilisez l'équilibreur de charge (échelle horizontale) si nécessaire et dans les limites du budget.
  • Si votre application a le public cible partout dans le monde, utilisez Azure Trafic Manager pour gérer automatiquement la demande entrante et la détourner vers l'instance d'application la plus disponible.
  • Essayez d'automatiser la surveillance des performances en écrivant les alertes en fonction des faibles performances.
Tahir Alvi
la source
0

Utilisez la dernière version de Task Parallel Library (TPL) , selon la version .Net. Vous devez choisir les bons modules de TPL pour différents usages.

agileDev
la source
0

J'ai fait toutes les réponses ci-dessus et cela n'a tout simplement pas résolu mon problème.

Enfin, j'ai résolu mon problème de chargement lent du site en définissant PrecompileBeforePublish dans Publish Profile sur true . Si vous souhaitez utiliser msbuild, vous pouvez utiliser cet argument:

 /p:PrecompileBeforePublish=true

Ça aide vraiment beaucoup. Maintenant, mon MVC ASP.NET se charge 10 fois plus rapidement.

Amir Pourmand امیر پورمند
la source