Antworten:
Eine zusammengestellte Liste möglicher Verbesserungsquellen finden Sie unten:
Allgemeines
Caching
CompiledQuery.Compile()
rekursiv, um eine Neukompilierung Ihrer Abfrageausdrücke zu vermeidenOutputCacheAttribute
, um unnötige und Aktionsausführungen zu speichernActionResult
Methoden bei BedarfRouteName
, 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.PartialViews
und 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 BenchmarksRouting
Verwenden Sie Url.RouteUrl("User", new { username = "joeuser" })
diese Option, um Routen anzugeben. ASP.NET MVC Perfomance von Rudi Benkovic
Auflösen der Cache-Route mit diesem Helfer UrlHelperCached
ASP.NET MVC Perfomance von Rudi Benkovic
Sicherheit
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
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>
<pages buffer="true" enableViewState="false">
Der grundlegende Vorschlag besteht darin, den REST-Prinzipien zu folgen. Die folgenden Punkte verbinden einige dieser Prinzipien mit dem ASP.NET MVC-Framework:
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.
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.
Wenn Sie über LINQ auf Daten zugreifen, verlassen Sie sich auf IQueryable ...
Warum AsQueryable () anstelle von List () verwenden?
... und nutzen Sie ein gutes Repository-Muster:
Laden von Unteraufzeichnungen in das Repository-Muster
Dadurch wird der Datenzugriff optimiert, um sicherzustellen, dass nur die benötigten Daten geladen werden und nur dann, wenn sie benötigt werden.
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.
Wenn Sie NHibernate verwenden , können Sie den Cache der zweiten Ebene für Abfragen aktivieren und einrichten und den Abfragebereich und das Zeitlimit erweitern. Und es gibt einen Kick-Ass-Profiler für EF , L2S und NHibernate - http://hibernatingrhinos.com/products/UberProf . Es wird Ihnen helfen, Ihre Abfragen zu optimieren.
Ich werde auch hinzufügen:
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 .
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.
Verwenden Sie ADO.NET anstelle von Entity Framework : Sie können EF4 or EF5
die 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.
Cache-Seite oder Teilseite : MVC bietet einen einfachen Filter zum Zwischenspeichern von Seiten gemäß einigen Parametern. Verwenden Sie ihn daher.
Datenbankaufrufe reduzieren : Sie können eine eindeutige Datenbankanforderung erstellen, die mehrere Objekte zurückgibt. Überprüfen Sie auf der Dapper-Website.
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.
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).
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.
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.
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?
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 .
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.
Es folgen Dinge, die zu tun sind
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.
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.