Comment puis-je m'améliorer ASP.NET performance de L'application MVC?

comment améliorez-vous votre ASP.NET performance de L'application MVC?

202
demandé sur SDReyes 2010-02-11 20:25:08

16 réponses

voici une liste compilée des sources possibles d'amélioration:

général

  • utilisez un profileur pour découvrir les fuites de mémoire et les problèmes de performance dans votre application. personnellement, je suggère dotTrace
  • exécutez votre site en mode Release, pas en mode Debug, lors de la production, et aussi lors du profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode de débogage peut cacher des problèmes de performance dans votre propre code.

mise en Cache

  • Utiliser CompiledQuery.Compile() éviter de façon récurrente recompilation de votre requête expressions
  • Cache non-sujette à changement contenu utilisant OutputCacheAttribute pour sauver inutile et action exécutions
  • utiliser des cookies pour les informations non sensibles fréquemment consultées
  • Utiliser ETags et la date d'expiration - Écrivez votre propre ActionResult méthodes si nécessaire
  • envisagez d'utiliser le RouteName pour organiser vos itinéraires et ensuite l'utiliser pour générer vos liens, et essayez de ne pas utiliser la méthode ActionLink basée sur l'arbre des expressions.
  • envisager la mise en œuvre d'une stratégie de mise en cache de résolution de parcours
  • mettez du code répétitif dans votre PartialViews , évitez de le rendre xxxx times: si vous finissez par appeler le même partial 300 fois dans la même vue, il y a probablement quelque chose de mal à cela. Explication Et De Repères

Routage

Sécurité

  • utiliser des formulaires D'authentification, conserver vos données sensibles fréquemment consultées dans le ticket d'authentification

DAL

équilibrage de la charge

  • utilisez des mandataires inversés, pour répartir la charge du client sur votre instance app. (Débordement de pile utilise HAProxy ( MSDN ).

  • Utiliser Asynchrone Contrôleurs à mettre en œuvre des actions qui dépendent de ressources externes de traitement.

Côté Client

  • Optimisez votre côté client, utilisez un outil comme YSlow pour suggestions pour améliorer la performance
  • utilisez AJAX pour mettre à jour les composants de votre UI, évitez une mise à jour complète de la page lorsque c'est possible.
  • envisager de mettre en œuvre une architecture de type pub-sub-c'est - à-dire Comet-pour la livraison du contenu contre rechargez en fonction des temps morts.
  • Déplacer la cartographie et la production de graphiques logique du côté du client si possible. Génération de graphiques est une activité coûteuse. Déferrer au côté client votre serveur à partir d'un charge inutile, et vous permet de travailler avec des graphiques localement sans faire un nouveau request (i.e. Flex charting, jqbargraph , MoreJqueryCharts ).
  • utiliser CDN pour les scripts et le contenu multimédia pour améliorer le chargement du côté client (i.e. Google CDN )
  • Minify - compiler - votre JavaScript afin d'améliorer la taille de votre script
  • garder la taille des cookies petit, puisque les cookies sont envoyés au serveur sur chaque demande.
  • envisager d'utiliser DNS et préfixation de la liaison lorsque cela est possible.

configuration Globale

  • si vous utilisez le rasoir, ajoutez le code suivant dans votre global.asax.cs, par défaut, Asp.Net MVC rend avec un moteur aspx et un moteur razor. Il n'utilise que le moteur RazorViewEngine.

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

  • Add gzip (compression HTTP) and static cache (images, css, ...) de votre site web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • supprimer les Modules HTTP non utilisés
  • Videz votre HTML dès qu'il est généré (en votre web.config) et désactiver le viewstate si vous ne l'utilisez pas <pages buffer="true" enableViewState="false">
289
répondu SDReyes 2017-05-23 12:18:28

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

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

10
répondu LukLed 2013-02-27 09:54:09

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

  1. Make your controllers stateless - il s'agit plus d'une Web performance / scalability" suggestion (par opposition à micro / machine level performance) et une décision de conception majeure qui affecterait vos applications avenir - en particulier dans cas, il devient populaire, ou si vous avez besoin d'une certaine tolérance de panne par exemple.
    • N'utilisez pas les Sessions
    • N'utilisez pas tempdata-qui utilise des sessions
    • N'essayez pas de "cacher" tout "prématurément".
  2. Utiliser L'Authentification Par Formulaires
    • Gardez vos fréquemment consulté les données sensibles dans le ticket d'authentification
  3. utiliser des cookies pour les informations non sensibles fréquemment consultées
  4. Faire de votre ressources cachable sur le web
  5. compilez votre JavaScript. il y a une bibliothèque de compilateurs de fermeture pour le faire aussi bien (bien sûr il y en a d'autres, il suffit de chercher 'compilateur JavaScript' aussi)
  6. utilisez CDNs (réseau de diffusion de contenu) - en particulier pour vos grands fichiers multimédia et ainsi de suite.
  7. envisager différents types de stockage pour vos données, par exemple, les fichiers, les clés/magasins de valeur, etc. - non seulement SQL Server
  8. last but not least, testez la performance de votre site web
10
répondu ziya 2016-06-15 02:39:32

cela peut sembler évident, mais exécutez votre site en mode Release, pas en mode Debug, lors de la production, et aussi lors du profilage des performances. Le mode de libération est beaucoup plus rapide. Le mode de débogage peut cacher des problèmes de performance dans votre propre code.

7
répondu Craig Stuntz 2010-08-05 12:23:27

lors de L'accès aux données via LINQ compter sur IQueryable ...

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

... et tirer parti d'un bon modèle de dépôt:

Chargement Subrecords dans le Modèle de Référentiel

ceci optimisera l'accès aux données pour s'assurer que seules les données nécessaires sont chargées et quand seulement elles sont nécessaires.

6
répondu Keith Adler 2017-05-23 11:55:10

ce n'est pas une optimisation terrifiante, mais j'ai pensé jeter ça dehors - utilisez CDN pour jQuery, etc. .

citation de ScottGu lui-même: le Microsoft Ajax CDN vous permet d'améliorer de manière significative les performances de ASP.NET formulaires Web et ASP.NET les applications MVC qui utilisent ASP.NET AJAX ou jQuery. Le service est gratuit, ne nécessite aucune inscription, et peut être utilisé à la fois commerciale et à des fins non commerciales.

nous utilisons même le CDN pour nos webparts en mousse qui utilisent jQuery.

6
répondu kd7 2016-06-15 02:35:29

aussi si vous utilisez NHibernate vous pouvez activer et configurer le cache de deuxième niveau pour les requêtes et Ajouter aux requêtes scope et timeout. Et il y a kick ass profiler pour EF , L2S et NHibernate - http://hibernatingrhinos.com/products/UberProf . Il vous aidera à ajuster vos requêtes.

6
répondu Peter Mortensen 2016-06-15 02:40:21

j'ajouterai aussi:

  1. utilisez 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 obtenir à bon une partie de l'image-objet. Microsoft fournit une bonne bibliothèque pour le faire: Sprite et d'Optimisation d'Images de Preview 4 .

  2. Cache de Votre serveur d'objet : Si vous avez quelques les listes de références ou les données qui changeront rarement, vous pouvez les mettre en cache dans la mémoire au lieu de questionner la base de données à chaque fois.

  3. utilisation ADO.NET au lieu du cadre D'entité : EF4 or EF5 sont grands pour réduire le temps de développement, mais il sera douloureux d'optimiser. Il est plus simple d'optimiser un procédure stockée que L'entité Framework. Vous devez donc utiliser les procédures de stockage autant que possible. Dapper fournit une façon simple d'interroger et de map SQL avec très bon performance.

  4. Page Cache ou page partielle : MVC fournit un filtre facile à la page cache selon certains paramètres, donc utilisez-le.

  5. réduire les appels de base de données : vous pouvez créer une requête de base de données unique qui renvoie plusieurs objets. Consultez le site Web de Dapper.

  6. ont toujours une architecture propre : avoir une architecture n-tiers propre, même sur un petit projet. Il vous aidera à garder votre code propre, et il sera plus facile pour l'optimiser si nécessaire.

  7. vous pouvez jeter un oeil à ce modèle " NEOS-SDI MVC Template " qui va créer une architecture propre pour vous avec beaucoup de amélioration des performances par défaut (check MvcTemplate site.)

5
répondu Jeff Lequeux 2016-11-02 06:54:22

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

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

4
répondu Steve Haigh 2016-06-15 02:40:56

une chose très facile à faire est de penser de manière asynchrone lors de l'accès aux données que vous voulez pour la page. Que vous lisiez à partir d'un service web, d'un fichier, d'une base de données ou autre chose, utilisez autant que possible le modèle async. Bien qu'il ne sera pas nécessairement aider une page à être plus rapide, il aidera votre serveur à mieux fonctionner dans l'ensemble.

3
répondu No Refunds No Returns 2010-02-12 18:14:27

1: Obtenir Des Horaires. Jusqu'à ce que vous sachiez où est le ralentissement, la question est trop large pour 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 timings au projet.

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

3: généraliser vos vues MVC lors de la publication... Cela aidera avec certains de la "première page hit"

4: certains plaident pour la procédure stockée/avantages ADO de la vitesse. D'autres plaident pour une vitesse de développement de L'EF et une séparation plus claire des niveaux et de leur but. J'ai vu des conceptions vraiment lentes quand SQL et les solutions de rechange pour utiliser Sprocs/vues pour la récupération et le stockage de données. Aussi, votre difficulté à tester augmente. Notre base de données actuelle que nous sommes en train de convertir de ADO à EF n'est pas plus mauvais (et dans certains cas meilleur) que le vieux modèle laminé à la main.

5: Cela dit, Pensez à L'échauffement des applications. Une partie de ce que nous faisons pour aider à éliminer la plupart de nos problèmes de performance de L'EF était d'ajouter une méthode spéciale d'échauffement. Il ne précompile aucune requête ou quoi que ce soit, mais il aide avec une grande partie du chargement/génération de métadonnées. Cela peut être encore plus important lorsque L'on traite des premiers modèles de Code.

6: Comme autres n'utilisez pas Session state 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 exclut cette possibilité. Imaginez une requête longue durée. Vous décidez d'ouvrir une nouvelle fenêtre et de s'essayer à moins complexe. Eh bien, vous pouvez aussi bien avoir attendu avec l'état de session sur, parce que le serveur va attendre jusqu'à ce que la première requête soit faite avant de passer à la suivante pour cette session.

7: réduire au minimum les voyages aller-retour vers la base de données. Enregistrez les objets que vous utilisez fréquemment, mais qui ne seront pas modifiés de façon réaliste dans votre Cache.Net. Essayez de grouper vos inserts/mises à jour si possible.

7.1: Évitez le code D'accès de données dans vos vues de rasoir sans une foutue bonne raison. Je ne dirais pas ça si je ne l'avais pas vu. Ils avaient déjà accès à leurs données quand ils ont assemblé le modèle, pourquoi ne l'ont-ils pas inclus dans le modèle?

2
répondu to11mtm 2015-03-18 23:26:39

je voulais juste ajouter mes 2 cents. Le moyen le plus efficace pour optimiser la génération de route URL dans une application MVC est... pas de générer.

la plupart d'entre nous savent plus ou moins comment les URLs sont générées dans nos applications de toute façon, donc en utilisant simplement Url.Content("~/Blahblah") statique au lieu de Url.Action() ou Url.RouteUrl() où possible, bat toutes les autres méthodes de près de 20 fois et même plus.

PS. J'ai couru un test de quelques milliers d'itérations et posté les résultats sur mon blog si intéressé.

2
répondu Alex 2017-08-22 16:15:51

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

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

1
répondu Robbie Dee 2015-07-20 10:36:49
  1. Mettre En Œuvre Gzip.
  2. utiliser un rendu asynchrone pour les vues partielles.
  3. minimise les accès à la base de données.
  4. utilisez une requête compilée.
  5. lancez un profileur et découvrez les résultats inutiles. Optimiser toutes les procédures stockées qui prennent plus d'une seconde pour retourner une réponse.
  6. utiliser la mise en cache.
  7. Use bundling minification optimisation.
  8. utilisez les utilitaires HTML 5 comme le cache de session et le stockage local pour les contenus en lecture seule.
1
répondu Vinayak 2016-06-15 02:50:30

ce qui suit sont des choses à faire

  1. Noyau Cache en mode
  2. mode Pipeline
  3. supprimer les modules non utilisés
  4. runallmanagedmodulesfor all requests
  5. Ne pas écrire dans wwwroot
  6. Supprimer les moteurs de visualisation et de la langue
0
répondu Zahid Mustafa 2017-04-03 09:24:00

L'utilisation de Bundling et Minification vous aide également à améliorer les performances. Cela réduit le temps de chargement de la page.

0
répondu Neelima 2017-07-12 22:30:48