Wie verbessere ich die Leistung von ASP.NET MVC-Anwendungen?

Antworten:

311

Eine zusammengestellte Liste möglicher Verbesserungsquellen finden Sie unten:

Allgemeines

  • Verwenden Sie einen Profiler, um Speicherverluste und Leistungsprobleme in Ihrer Anwendung zu erkennen. persönlich schlage ich dotTrace vor
  • Führen Sie Ihre Site im Release-Modus und nicht im Debug-Modus aus, wenn Sie sich in der Produktion befinden und auch während der Leistungsprofilerstellung. Der Release-Modus ist viel schneller. Der Debug-Modus kann Leistungsprobleme in Ihrem eigenen Code verbergen.

Caching

  • Verwenden Sie CompiledQuery.Compile() rekursiv, um eine Neukompilierung Ihrer Abfrageausdrücke zu vermeiden
  • Cache nicht anfälliger Inhalte OutputCacheAttribute , um unnötige und Aktionsausführungen zu speichern
  • Verwenden Sie Cookies für häufig aufgerufene nicht vertrauliche Informationen
  • Nutzen Sie ETags und Ablauf - Schreiben Sie benutzerdefinierte ActionResultMethoden bei Bedarf
  • Verwenden Sie das RouteName, um Ihre Routen zu organisieren, und verwenden Sie es dann, um Ihre Links zu generieren, und versuchen Sie, die auf dem Ausdrucksbaum basierende ActionLink-Methode nicht zu verwenden.
  • Erwägen Sie die Implementierung einer Caching-Strategie für die Routenauflösung
  • Fügen Sie sich wiederholenden Code in Ihren Code ein PartialViewsund vermeiden Sie es, ihn xxxx Mal zu rendern. Wenn Sie am Ende denselben Teil 300 Mal in derselben Ansicht aufrufen, stimmt wahrscheinlich etwas nicht. Erklärung und Benchmarks

Routing

Sicherheit

  • Verwenden Sie die Formularauthentifizierung. Behalten Sie Ihre häufig verwendeten vertraulichen Daten im Authentifizierungsticket

DAL

Lastverteilung

  • Verwenden Sie Reverse-Proxys, um die Client-Last auf Ihre App-Instanz zu verteilen. (Stapelüberlauf verwendet HAProxy ( MSDN ).

  • Verwenden Sie asynchrone Controller , um Aktionen zu implementieren, die von der Verarbeitung externer Ressourcen abhängen.

Client-Seite

  • Optimieren Sie Ihre Client-Seite und verwenden Sie ein Tool wie YSlow, um Vorschläge zur Verbesserung der Leistung zu erhalten
  • Verwenden Sie AJAX, um Komponenten Ihrer Benutzeroberfläche zu aktualisieren. Vermeiden Sie nach Möglichkeit eine Aktualisierung der gesamten Seite.
  • Erwägen Sie die Implementierung einer Pub-Sub-Architektur -ie Comet- für die Bereitstellung von Inhalten gegen erneutes Laden basierend auf Zeitüberschreitungen.
  • Verschieben Sie die Logik für Diagramme und Diagrammerzeugung nach Möglichkeit auf die Clientseite. Die Erzeugung von Graphen ist eine teure Aktivität. Wenn Sie Ihren Server von einer unnötigen Belastung auf die Clientseite verschieben, können Sie lokal mit Diagrammen arbeiten, ohne eine neue Anforderung zu stellen (z. B. Flex-Diagramme, jqbargraph , MoreJqueryCharts ).
  • Verwenden Sie CDNs für Skripte und Medieninhalte, um das Laden auf der Clientseite zu verbessern (z. B. Google CDN ).
  • Minimieren - Kompilieren - Sie Ihr JavaScript, um Ihre Skriptgröße zu verbessern
  • Halten Sie die Cookie-Größe klein, da Cookies bei jeder Anfrage an den Server gesendet werden.
  • Erwägen Sie nach Möglichkeit die Verwendung von DNS und Link Prefetching .

Globale Konfiguration

  • Wenn Sie Razor verwenden, fügen Sie den folgenden Code in Ihre global.asax.cs ein. Standardmäßig wird Asp.Net MVC mit einer Aspx-Engine und einer Razor-Engine gerendert. Dies verwendet nur die RazorViewEngine.

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

  • Fügen Sie gzip (HTTP-Komprimierung) und den statischen Cache (Bilder, CSS, ...) in Ihre web.config ein <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Entfernen Sie nicht verwendete HTTP-Module
  • Leeren Sie Ihren HTML-Code, sobald er generiert wurde (in Ihrer web.config), und deaktivieren Sie den Ansichtsstatus, wenn Sie ihn nicht verwenden <pages buffer="true" enableViewState="false">
SDReyes
quelle
6
Warten Sie, Sie meinen, ich verliere die Leistung, wenn ich z. B. eine Ansicht habe, die eine Ergebnismenge anzeigt, indem ich durch eine IList irritiere und Render.PartialView ("Zeile", Element) für jedes Listenelement aufrufe. Wie viel verliere ich? oder wie könnte ich den Leistungsgewinn messen?
März
@SDReyes - Was bedeutet Pub-Sub-Architektur ?
Mohammed Zameer
1
Das ist cool. Der Uber Profiler Link ist jedoch tot. Sollte dies stattdessen mit einem der ORM-spezifischen Profiler verknüpft werden?
Shanabus
12

Der grundlegende Vorschlag besteht darin, den REST-Prinzipien zu folgen. Die folgenden Punkte verbinden einige dieser Prinzipien mit dem ASP.NET MVC-Framework:

  1. Machen Sie Ihre Controller staatenlos - das ist eher ein ‚ Web Performance / Skalierbarkeit‘ Vorschlag (im Gegensatz zu Mikro / Maschine - Level - Performance gegenüber ) und eine große Design - Entscheidung , die Ihre Anwendungen Zukunft beeinflussen würde - vor allem für den Fall , es wird immer beliebter oder wenn Sie einige brauchen Fehlertoleranz zum Beispiel.
    • Verwenden Sie keine Sitzungen
    • Verwenden Sie keine Tempdata, die Sitzungen verwenden
    • Versuchen Sie nicht, alles "vorzeitig" zwischenzuspeichern.
  2. Verwenden Sie die Formularauthentifizierung
    • Behalten Sie Ihre häufig verwendeten vertraulichen Daten im Authentifizierungsticket
  3. Verwenden Sie Cookies für häufig aufgerufene nicht vertrauliche Informationen
  4. Machen Sie Ihre Ressourcen im Web zwischenspeicherbar
  5. Kompilieren Sie Ihr JavaScript. Es gibt auch eine Closure-Compiler-Bibliothek, um dies zu tun (sicher gibt es andere, suchen Sie einfach auch nach 'JavaScript-Compiler' )
  6. Verwenden Sie CDNs (Content Delivery Network) - insbesondere für Ihre großen Mediendateien usw.
  7. Berücksichtigen Sie verschiedene Speichertypen für Ihre Daten, z. B. Dateien, Schlüssel- / Wertspeicher usw. - nicht nur SQL Server
  8. Testen Sie zu guter Letzt Ihre Website auf Leistung
ziya
quelle
10

Code Climber und dieser Blogeintrag bieten detaillierte Möglichkeiten zur Steigerung der Anwendungsleistung.

Kompilierte Abfragen erhöhen die Leistung Ihrer Anwendung, haben jedoch nichts mit ASP.NET MVC gemeinsam. Es wird jede Datenbankanwendung beschleunigen, daher geht es nicht wirklich um MVC.

LukLed
quelle
7

Dies mag offensichtlich erscheinen, aber führen Sie Ihre Site im Release-Modus und nicht im Debug-Modus aus, wenn Sie in der Produktion sind und auch während der Leistungsprofilerstellung. Der Release-Modus ist viel schneller. Der Debug-Modus kann Leistungsprobleme in Ihrem eigenen Code verbergen.

Craig Stuntz
quelle
6

Nicht eine weltbewegend Optimierung, aber ich dachte ich , das da draußen werfen würde - Verwenden CDN für jQuery etc. .

Zitat von ScottGu selbst: Mit dem Microsoft Ajax CDN können Sie die Leistung von ASP.NET Web Forms und ASP.NET MVC-Anwendungen, die ASP.NET AJAX oder jQuery verwenden, erheblich verbessern. Der Dienst ist kostenlos verfügbar, erfordert keine Registrierung und kann sowohl für kommerzielle als auch für nichtkommerzielle Zwecke verwendet werden.

Wir verwenden das CDN sogar für unsere Webparts in Moss, die jQuery verwenden.

Ta01
quelle
5

Ich werde auch hinzufügen:

  1. Sprites verwenden : Sprites sind eine großartige Sache, um eine Anfrage zu reduzieren. Sie führen alle Ihre Bilder zu einem einzigen zusammen und verwenden CSS, um einen guten Teil des Sprites zu erreichen. Microsoft bietet hierfür eine gute Bibliothek: Sprite und Image Optimization Preview 4 .

  2. Cache Ihr Serverobjekt : Wenn Sie einige Referenzlisten oder Daten haben, die sich selten ändern, können Sie sie im Speicher zwischenspeichern, anstatt jedes Mal die Datenbank abzufragen.

  3. Verwenden Sie ADO.NET anstelle von Entity Framework : Sie können EF4 or EF5die Entwicklungszeit erheblich verkürzen, die Optimierung ist jedoch schmerzhaft. Es ist einfacher, eine gespeicherte Prozedur zu optimieren als Entity Framework. Daher sollten Sie die Speicherprozeduren so oft wie möglich verwenden. Dapper bietet eine einfache Möglichkeit, SQL mit sehr guter Leistung abzufragen und zuzuordnen.

  4. Cache-Seite oder Teilseite : MVC bietet einen einfachen Filter zum Zwischenspeichern von Seiten gemäß einigen Parametern. Verwenden Sie ihn daher.

  5. Datenbankaufrufe reduzieren : Sie können eine eindeutige Datenbankanforderung erstellen, die mehrere Objekte zurückgibt. Überprüfen Sie auf der Dapper-Website.

  6. Immer eine saubere Architektur : Haben Sie eine saubere n-Ebenen-Architektur, auch bei kleinen Projekten. Es wird Ihnen helfen, Ihren Code sauber zu halten, und es wird einfacher sein, ihn bei Bedarf zu optimieren.

  7. Sie können sich diese Vorlage " Neos-SDI MVC-Vorlage " ansehen, die standardmäßig eine saubere Architektur mit vielen Leistungsverbesserungen für Sie erstellt ( siehe MvcTemplate- Website).

Jeff Lequeux
quelle
Halten Sie es für besser, eine gespeicherte Prozedur auszuführen, die mehr Ergebnismengen zurückgibt, als mehr gespeicherte Prozeduren im asynchronen Modus auszuführen?
Muflix
4

Neben all den tollen Informationen zur Optimierung Ihrer Anwendung auf der Serverseite sollten Sie sich YSlow ansehen . Es ist eine hervorragende Ressource zur Verbesserung der Site-Leistung auf der Client-Seite.

Dies gilt für alle Sites, nicht nur für ASP.NET MVC.

Steve Haigh
quelle
3

Eine super einfache Sache ist, beim Zugriff auf die Daten, die Sie für die Seite wünschen, asynchron zu denken. Verwenden Sie das asynchrone Modell so oft wie möglich, unabhängig davon, ob Sie von einem Webdienst, einer Datei, einer Datenbank oder etwas anderem lesen. Es hilft zwar nicht unbedingt, dass eine Seite schneller ist, aber es hilft Ihrem Server, insgesamt eine bessere Leistung zu erzielen.

Keine Rückerstattung Keine Rückgabe
quelle
2

1: Holen Sie sich Timings. Bis Sie wissen, wo die Verlangsamung liegt, ist die Frage zu weit gefasst, um sie zu beantworten. Ein Projekt, an dem ich arbeite, hat genau dieses Problem. Es gibt keine Protokollierung, um zu wissen, wie lange bestimmte Dinge dauern. Wir können nur die langsamen Teile der App erraten, bis wir dem Projekt Timings hinzufügen.

2: Wenn Sie sequentielle Operationen haben, haben Sie keine Angst vor leichtem Multithread. INSBESONDERE, wenn Blockierungsvorgänge beteiligt sind. PLINQ ist dein Freund hier.

3: Generieren Sie Ihre MVC-Ansichten beim Veröffentlichen vorab ... Dies hilft bei einigen der ersten Seitenaufrufe.

4: Einige argumentieren für die Vorteile der Geschwindigkeit für gespeicherte Prozeduren / ADO. Andere plädieren für eine schnellere Entwicklung der EF und eine klarere Trennung der Ebenen und ihres Zwecks. Ich habe sehr langsame Designs gesehen, als SQL und die Problemumgehungen, Sprocs / Views zum Abrufen und Speichern von Daten zu verwenden. Auch Ihre Schwierigkeit zu testen steigt. Unsere aktuelle Codebasis, die wir von ADO zu EF konvertieren, ist nicht schlechter (und in einigen Fällen besser) als das alte handgerollte Modell.

5: Das heißt, denken Sie an Application Warmup. Ein Teil unserer Maßnahmen zur Beseitigung der meisten Probleme mit der EF-Leistung bestand darin, eine spezielle Aufwärmmethode hinzuzufügen. Es kompiliert keine Abfragen oder ähnliches vor, hilft aber beim Laden / Generieren von Metadaten. Dies kann beim Umgang mit Code First-Modellen noch wichtiger sein.

6: Wie bereits erwähnt, verwenden Sie nach Möglichkeit nicht den Sitzungsstatus oder ViewState. Dies sind nicht unbedingt Leistungsoptimierungen, über die Entwickler nachdenken. Sobald Sie jedoch mit dem Schreiben komplexerer Webanwendungen beginnen, möchten Sie schnell reagieren. Der Sitzungsstatus schließt dies aus. Stellen Sie sich eine lange laufende Abfrage vor. Sie beschließen, ein neues Fenster zu öffnen und ein weniger komplexes zu versuchen. Möglicherweise haben Sie auch mit aktiviertem Sitzungsstatus gewartet, da der Server wartet, bis die erste Anforderung abgeschlossen ist, bevor er für diese Sitzung zur nächsten wechselt.

7: Minimieren Sie Roundtrips zur Datenbank. Speichern Sie häufig verwendete Elemente, die sich jedoch nicht realistisch in Ihrem .NET-Cache ändern. Versuchen Sie, Ihre Einfügungen / Aktualisierungen nach Möglichkeit zu stapeln.

7.1: Vermeiden Sie Datenzugriffscode in Ihren Razor-Ansichten ohne verdammt guten Grund. Ich würde das nicht sagen, wenn ich es nicht gesehen hätte. Sie haben bereits beim Zusammenstellen des Modells auf ihre Daten zugegriffen. Warum zum Teufel haben sie sie nicht in das Modell aufgenommen?

to11mtm
quelle
2
  1. Implementieren Sie Gzip.
  2. Verwenden Sie asynchrones Rendern für Teilansichten.
  3. Minimieren Sie Datenbanktreffer.
  4. Verwenden Sie eine kompilierte Abfrage.
  5. Führen Sie einen Profiler aus und finden Sie unnötige Treffer heraus. Optimieren Sie alle gespeicherten Prozeduren, deren Antwort länger als 1 Sekunde dauert.
  6. Verwenden Sie Caching.
  7. Verwenden Sie die Optimierung der Bündelungsminimierung .
  8. Verwenden Sie HTML 5-Dienstprogramme wie den Sitzungscache und den lokalen Speicher für schreibgeschützte Inhalte.
Vinayak
quelle
2

Ich wollte nur meine 2 Cent hinzufügen. Der effektivste Weg, um die URL-Routengenerierung in einer MVC-Anwendung zu optimieren, besteht darin, ... sie überhaupt nicht zu generieren.

Die meisten von uns wissen sowieso mehr oder weniger, wie URLs in ihren Apps generiert werden. Wenn Sie also einfach statisch Url.Content("~/Blahblah")anstelle von Url.Action()oder Url.RouteUrl()wo möglich verwenden, übertreffen Sie alle anderen Methoden um fast das 20-fache und sogar noch mehr.

PS. Ich habe einen Benchmark von ein paar tausend Iterationen durchgeführt und bei Interesse Ergebnisse in meinem Blog veröffentlicht .

Alex
quelle
1

Vergessen Sie in Ihrem Bestreben, die Clientseite zu optimieren, nicht die Datenbankebene. Wir hatten eine Anwendung, die von 5 Sekunden bis zu 50 Sekunden über Nacht geladen wurde.

Bei der Inspektion hatten wir eine ganze Reihe von Schemaänderungen vorgenommen. Nachdem wir die Statistiken aktualisiert hatten, reagierte sie plötzlich so schnell wie zuvor.

Robbie Dee
quelle
0

Es folgen Dinge, die zu tun sind

  1. Kernel-Modus-Cache
  2. Pipeline-Modus
  3. Entfernen Sie nicht verwendete Module
  4. runAllManagedModulesForAllRequests
  5. Schreiben Sie nicht in wwwroot
  6. Entfernen Sie nicht verwendete Ansichtsmodule und Sprache
Zahid Mustafa
quelle
0

Durch die Verwendung von Bündelung und Minimierung können Sie auch die Leistung verbessern. Dies reduziert im Wesentlichen die Ladezeit der Seite.

Neelima
quelle
0

Wenn Sie Ihre ASP.NET MVC-Anwendung unter Microsoft Azure (IaaS oder PaaS) ausführen, gehen Sie mindestens vor der ersten Bereitstellung wie folgt vor.

  • Scannen Sie Ihren Code mit dem Static Code Analyzer auf jede Art von Code-Verschuldung, Duplizierung, Komplexität und Sicherheit.
  • Aktivieren Sie immer Application Insight und überwachen Sie die Leistung, Browser und Analysen regelmäßig, um die Echtzeitprobleme in der Anwendung zu ermitteln.
  • Implementieren Sie den Azure Redis-Cache für statische und weniger häufige Änderungsdaten wie Bilder, Assets, allgemeine Layouts usw.
  • Verlassen Sie sich immer auf die von Azure bereitgestellten APM-Tools (Application Performance Management).
  • Informationen zur Kommunikationsleistung zwischen internen Teilen der Anwendung finden Sie häufig in der Anwendungsübersicht.
  • Überwachen Sie auch die Datenbank- / VM-Leistung.
  • Verwenden Sie bei Bedarf und innerhalb des Budgets den Load Balancer (horizontale Skalierung).
  • Wenn Ihre Anwendung die Zielgruppe auf der ganzen Welt hat, verwenden Sie Azure Trafic Manager, um die eingehende Anforderung automatisch zu verarbeiten und an die am besten verfügbare Anwendungsinstanz umzuleiten.
  • Versuchen Sie, die Leistungsüberwachung zu automatisieren, indem Sie die Warnungen basierend auf geringer Leistung schreiben.
Tahir Alvi
quelle
0

Verwenden Sie die neueste Version der Task Parallel Library (TPL) gemäß der .NET-Version. Müssen die richtigen Module von TPL für verschiedene Zwecke auswählen.

agileDev
quelle
0

Ich habe alle Antworten oben gemacht und es hat mein Problem einfach nicht gelöst.

Schließlich habe ich mein Problem beim langsamen Laden von Websites gelöst, indem ich PrecompileBeforePublish in Publish Profile auf true gesetzt habe . Wenn Sie msbuild verwenden möchten , können Sie dieses Argument verwenden:

 /p:PrecompileBeforePublish=true

Es hilft wirklich sehr. Jetzt wird mein MVC ASP.NET zehnmal schneller geladen.

Amir Pourmand امیر پورمند
quelle