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
Mise en cache
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 ActionResult
personnalisées si nécessaire 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. 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é
DAL
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
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
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:
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:
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 .
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.
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.
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.
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.
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.
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.
Voici les choses à faire
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.