Odpowiedzi:
Skompilowana lista możliwych źródeł ulepszeń znajduje się poniżej:
Generał
Buforowanie
CompiledQuery.Compile()
rekurencyjnie, unikając ponownej kompilacji wyrażeń zapytaniaOutputCacheAttribute
która nie jest podatna na zmiany, aby zapisać niepotrzebne i działaniaActionResult
razie potrzeby napisz własne metodyRouteName
do organizowania tras, a następnie użyj jej do wygenerowania linków, i spróbuj nie używać metody ActionLink opartej na drzewie wyrażeń.PartialViews
, unikaj renderowania go xxxx : jeśli skończysz wywoływać te same częściowe 300 razy w tym samym widoku, prawdopodobnie coś jest z tym nie tak. Wyjaśnienie i testyWytyczanie
Służy Url.RouteUrl("User", new { username = "joeuser" })
do określania tras.ASP.NET MVC Perfomance autorstwa Rudi Benkovic
Rozwiązywanie tras w pamięci podręcznej za pomocą tego pomocnika UrlHelperCached
ASP.NET MVC Perfomance autorstwa Rudi Benkovica
Bezpieczeństwo
DAL
Równoważenie obciążenia
Użyj odwrotnych serwerów proxy, aby rozłożyć obciążenie klienta na instancję aplikacji. (Przepełnienie stosu używa HAProxy ( MSDN ).
Użyj kontrolerów asynchronicznych, aby zaimplementować działania zależne od przetwarzania zasobów zewnętrznych.
Strona klienta
Konfiguracja globalna
Jeśli używasz Razor, dodaj następujący kod do pliku global.asax.cs, domyślnie renderuje Asp.Net MVC z silnikiem aspx i silnikiem z ostrzami. To używa tylko RazorViewEngine.
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
Dodaj gzip (kompresja HTTP) i statyczną pamięć podręczną (obrazy, css, ...) w pliku web.config
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
</system.webServer>
<pages buffer="true" enableViewState="false">
Podstawową sugestią jest przestrzeganie zasad REST a następujące punkty wiążą niektóre z tych zasad z platformą ASP.NET MVC:
Code Climber i ten wpis na blogu zapewniają szczegółowe sposoby zwiększenia wydajności aplikacji.
Skompilowane zapytanie zwiększy wydajność aplikacji, ale nie ma nic wspólnego z ASP.NET MVC. Przyspieszy każdą aplikację db, więc tak naprawdę nie chodzi o MVC.
Może się to wydawać oczywiste, ale uruchom swoją witrynę w trybie Release, a nie w trybie Debugowania, podczas produkcji, a także podczas profilowania wydajności. Tryb zwolnienia jest znacznie szybszy. Tryb debugowania może ukryć problemy z wydajnością we własnym kodzie.
Podczas uzyskiwania dostępu do danych przez LINQ polegaj na IQueryable ...
Dlaczego warto korzystać z AsQueryable () zamiast List ()?
... i wykorzystaj dobry wzorzec repozytorium:
Ładowanie subrekordów do wzorca repozytorium
Pozwoli to zoptymalizować dostęp do danych, aby zapewnić, że tylko potrzebne dane są ładowane i tylko wtedy, gdy są potrzebne.
Nie jest to wstrząsająca optymalizacja, ale pomyślałem, że to tam wyrzucę - użyj CDN do jQuery itp .
Cytat z samego ScottGu: CDN Microsoft Ajax pozwala znacznie poprawić wydajność ASP.NET Web Forms i aplikacji ASP.NET MVC, które używają ASP.NET AJAX lub jQuery. Usługa jest dostępna za darmo, nie wymaga żadnej rejestracji i może być używana zarówno do celów komercyjnych, jak i niekomercyjnych.
Korzystamy nawet z CDN dla naszych stron internetowych w Moss, które używają jQuery.
Ponadto, jeśli korzystasz z NHibernate , możesz włączyć i skonfigurować pamięć podręczną drugiego poziomu dla zapytań oraz dodać do zakresu zapytań i limitu czasu. I jest profiler kick ass dla EF , L2S i NHibernate - http://hibernatingrhinos.com/products/UberProf . Pomoże to dostroić zapytania.
Dodam również:
Użyj duszka : duszki są świetną rzeczą do zmniejszenia żądania. Łączysz wszystkie swoje zdjęcia w jeden i używasz CSS, aby dostać się do znacznej części duszka. Microsoft zapewnia do tego dobrą bibliotekę: Sprite and Image Optimization Preview 4 .
Buforuj obiekt serwera : jeśli masz listy referencji lub dane, które rzadko się zmieniają, możesz je buforować w pamięci zamiast za każdym razem sprawdzać bazę danych.
Użyj ADO.NET zamiast Entity Framework : EF4 or EF5
świetnie skracają czas programowania, ale optymalizacja będzie bolesna. Łatwiej jest zoptymalizować procedurę przechowywaną niż Entity Framework. Powinieneś więc w jak największym stopniu korzystać z procedur sklepowych. Dapper zapewnia prosty sposób na zapytania i mapowanie SQL z bardzo dobrą wydajnością.
Strona pamięci podręcznej lub strona częściowa : MVC zapewnia łatwy filtr do pamięci podręcznej strony zgodnie z niektórymi parametrami, więc użyj go.
Zmniejsz liczbę wywołań bazy danych : możesz utworzyć unikalne żądanie bazy danych, które zwraca wiele obiektów. Sprawdź na stronie Dapper.
Zawsze miej czystą architekturę : miej czystą architekturę wielopoziomową, nawet przy małym projekcie. Pomoże Ci utrzymać kod w czystości, a łatwiej będzie go zoptymalizować w razie potrzeby.
Możesz rzucić okiem na ten szablon „ Neos-SDI MVC Template ”, który stworzy dla ciebie czystą architekturę z domyślnie dużą poprawą wydajności (sprawdź stronę MvcTemplate ).
Jedną z super łatwych rzeczy jest myślenie asynchroniczne podczas uzyskiwania dostępu do danych, które chcesz dla strony. Niezależnie od tego, czy czytasz z usługi internetowej, pliku, bazy danych czy czegoś innego, używaj modelu asynchronicznego w jak największym stopniu. Mimo że żadna strona nie musi być szybsza, ogólnie poprawia wydajność serwera.
1: Uzyskaj czasy. Dopóki nie dowiesz się, gdzie jest spowolnienie, pytanie jest zbyt ogólne, aby odpowiedzieć. Projekt, nad którym pracuję, ma dokładnie ten problem; Nie trzeba rejestrować, aby wiedzieć, ile czasu zajmuje pewne rzeczy; możemy tylko zgadywać, które części aplikacji są wolne, dopóki nie dodamy czasu do projektu.
2: Jeśli wykonujesz operacje sekwencyjne, nie bój się lekkiego wielowątkowości. W SZCZEGÓLNOŚCI, jeśli w grę wchodzą operacje blokowania. PLINQ jest tu twoim przyjacielem.
3: Wygeneruj wstępnie swoje widoki MVC podczas publikowania ... Pomoże to w niektórych „trafieniach na pierwszą stronę”
4: Niektórzy argumentują za zaletami procedury składowanej / ADO szybkości. Inni opowiadają się za szybkością rozwoju EF i bardziej wyraźnym podziałem poziomów i ich celem. Widziałem naprawdę powolne projekty, gdy SQL i sposoby obejścia korzystania z Sprocs / Views do pobierania i przechowywania danych. Również trudność w testowaniu rośnie. Nasza obecna baza kodu, którą konwertujemy z ADO na EF, nie jest gorsza (aw niektórych przypadkach lepsza) niż stary model ręcznie walcowany.
5: Powiedział, Pomyśl o rozgrzewce aplikacji. Częścią tego, co robimy, aby wyeliminować większość problemów z EF, było dodanie specjalnej metody rozgrzewki. Nie kompiluje żadnych zapytań ani niczego, ale pomaga przy ładowaniu / generowaniu metadanych. Może to być jeszcze ważniejsze w przypadku modeli Code First.
6: Jak powiedzieli inni, nie używaj stanu sesji lub ViewState, jeśli to możliwe. Niekoniecznie są to optymalizacje wydajności, o których myślą programiści, ale gdy zaczniesz pisać bardziej złożone aplikacje internetowe, potrzebujesz responsywności. Stan sesji wyklucza to. Wyobraź sobie długo działające zapytanie. Decydujesz się otworzyć nowe okno i wypróbować mniej skomplikowane. Cóż, równie dobrze mogłeś poczekać z włączonym stanem sesji, ponieważ serwer będzie czekał na wykonanie pierwszego żądania, zanim przejdzie do następnego dla tej sesji.
7: Minimalizacja podróży w obie strony do bazy danych. Zapisz rzeczy, których często używasz, ale nie zmienią się realistycznie w pamięci podręcznej .Net. Staraj się grupować wkładki / aktualizacje tam, gdzie to możliwe.
7.1: Unikaj kodu dostępu do danych w widokach Razor bez żadnego dobrego powodu. Nie powiedziałbym tego, gdybym tego nie widział. Już uzyskiwali dostęp do swoich danych, kiedy składali model, dlaczego, do cholery, nie włączali go do modelu?
Chciałem tylko dodać moje 2 centy. NAJBARDZIEJ skutecznym sposobem optymalizacji generowania tras adresów URL w aplikacji MVC jest ... wcale ich nie generowanie.
Większość z nas mniej więcej wie, w jaki sposób generowane są adresy URL w naszych aplikacjach, więc po prostu używając statycznego Url.Content("~/Blahblah")
zamiast Url.Action()
lub Url.RouteUrl()
tam, gdzie to możliwe, pokonuje wszystkie inne metody prawie 20 razy, a nawet więcej.
PS. Przeprowadziłem test porównawczy kilku tysięcy iteracji i opublikowałem wyniki na moim blogu, jeśli jestem zainteresowany.
W swoim dążeniu do optymalizacji strony klienta nie zapomnij o warstwie bazy danych. Mieliśmy aplikację, której ładowanie trwało od 5 sekund do 50 sekund w ciągu nocy.
Podczas inspekcji wprowadziliśmy wiele zmian schematu. Odświeżone statystyki stały się nagle tak responsywne jak wcześniej.
Oto rzeczy do zrobienia
Jeśli używasz aplikacji ASP.NET MVC na Microsoft Azure (IaaS lub PaaS), wykonaj następujące czynności przynajmniej przed pierwszym wdrożeniem.
Zrobiłem wszystkie powyższe odpowiedzi i to po prostu nie rozwiązało mojego problemu.
Wreszcie rozwiązałem problem powolnego ładowania witryny, ustawiając wartość PrecompileBeforePublish w profilu publikowania na wartość true . Jeśli chcesz użyć msbuild , możesz użyć tego argumentu:
/p:PrecompileBeforePublish=true
To naprawdę bardzo pomaga. Teraz mój MVC ASP.NET ładuje się 10 razy szybciej.