250 likes | 440 Views
Wydajne aplikacje na platformie .NET. Michał Jerzy Kostrzewa Microsoft Sp. z o.o. Plan. Definicje wydajności Optymalizacje CLR Optymalizacje bibliotek Optymalizacje .NET Framework Narzędzia. Definicje : Wydajność ?.
E N D
Wydajne aplikacjena platformie .NET Michał Jerzy Kostrzewa Microsoft Sp. z o.o.
Plan • Definicje wydajności • Optymalizacje CLR • Optymalizacje bibliotek • Optymalizacje .NET Framework • Narzędzia
Definicje : Wydajność ? • Minimalnie użycie zasobów ? Ilość pracujących użytkowników ? Czas wykonania operacji ? • ... Przez serwer? ... Przez komputer klienta? • Czas odpowiedzi( dł. kolejki * czas ) + czas Przepustowość il. zadań / czas • Zasadniczy wpływ na wydajność ma architektura • Wydajność jest wymaganiem podstawowym • Na etapie założeń i planowania… • Weryfikowanym na bieżąco na wszystkich etapach • Krótszy kod to szybszy kod ( są wyjątki… ) • Maksymalnie zbliżaj kod do używanych zasobów • Cenne zasoby odzyskuj i wykorzystaj ponownie • Wykorzystuj wolny czas procesora ( praca asynchroniczna )
Plan • Definicje wydajności • Optymalizacje CLR • Optymalizacje bibliotek • Optymalizacje .NET Framework • Narzędzia
CLR: Garbage Collector • GC – optymalizowany, szybszy niż C/C++ • Generacje - czas życia obiektu • Koszt : Gen. 0 – jak błąd strony ( 0 - 10 ms )Gen. 1 – ok.. 10 do 30 ms, • Generacja 2 (pełne): zależy od ( app. working set) • Odśmiecanie = dealokacja + konsolidacja wolnej pamięci • Bardzo duże obiekty są umieszczane na osobnej stercie ( LOH ) • Odśmiecanie działa z opóźnieniem • Aby nie spowalniać głównego programu…
CLR : Garbage Collector • Kiedy działa GC : heurystyka… • … co daje niedeterministyczną finalizację • Finalizacja przez osobny wątek, kolejka finalizacji • Zalecamy rezygnację z finalizatorów ! • Np. opakowanie min. klasy finalizowanej w niefinalizowaną • Jeśli wymagamy finalizacji – IDisposable.Dispose • Ręczne wywołania Dispose() / w C# using(..){//praca} • Można implementować finalizację oraz Dispose - GC.SuppressFinalize() • Zalecamy także: • korzystaj ze słabych referencji - „rezurekcja” • Nie wymuszaj odśmiecania ( GC.Collect(gen) ) • Dobry podgląd GC PerfMon 1
CLR : Reference vs value types • Typy reference są tworzone na stercie ( GC ) • Typy wartości są tworzone na stosie lub inline • Znakomite dla prostych struktur • Podstawowe typy platformy .NET - typy wartości • Pakowanie i odpakowanie ( boxing / unboxing ) • …gdy na Value Type wykonujemy operację jak na Reference Type • Np. wywołanie metody wirtualnej, operacje via Object • Pakowanie : alokacja sterty i kopiowanie • Sprawdź: ILDasm.exe, narzędzia profilujące • brak liczników PerfMon ! 2
CLR : Reflection, późne wiązanie • Refleksje mogą być kosztowne • Porównania ( typeof() ), wyliczenie ( Type.GetFields() ), dostęp ( Type.InvokeMember() ) • Ostrożnie - refleksje mogą być efektem ubocznymObject.ToString() , [Serializable] • Visual Basic .NET oraz JScript niejawnie obsługują późne wiązanie poprzez interfejs API Reflection • Gdy używamy zmiennych typu Object • Unikaj późnego wiązania - refleksje • W Visual Basic .NET wczesne wiązanie wymuszamy:Option Explicit On, Option Strict On 3
CLR : Structured Exception Handling • Ujednolicony mechanizm sygnalizacji AWARII • Wyjątki są tanie... dopóki nie zostaną zgłoszone • Optymalizacje : • Zgłaszaj wyjątki tylko w wyjątkowych sytuacjach - Nie używaj wyjątków do sterowania programem • Monitoring - liczniki wydajności 4
Plan • Definicje wydajności • Optymalizacje CLR • Optymalizacje bibliotek • Optymalizacje .NET Framework • Narzędzia
Biblioteki : Łańcuchy znaków • Zmienne typu System.String są niemodyfikowalne • Do manipulacji łańcuchami - klasaStringBuilder • Uwaga na porównania • String.CompareTo(), String.Compare(), String.CompareOrdinal() • string interning - Object.ReferenceEquals() • Uwaga na foreach() ( używa IEnumerable ) • Zamiast foreach(char c in str) { //praca c} • Uzyjfor(int i=0;i < str.Length;i++) {//praca str[i]} 5 5a
Biblioteki : Typy tablicowe • Zalecenia • używaj tabel ze ścisłą kontrolą typów ( wiązanie, boxing ) • ( JIT ) korzystaj z : for(i=0; i<myArray.Length; i++){;} • Zamiast tablic wielowymiarowych – tablice jagged • jagged są wydajniejsze (w v1), nie ma ich w CLS • Oszacuj rozmiary kolekcji • Zmiana rozmiaru wymaga zbędnych kopii • VB : uwaga na ReDim … Preserve
Biblioteki : Wielowątkowość • Wykorzystanie wielu wątków • Korzystaj z puli wątków ( wątki .NET a wątki OS ) • Lepsza wydajność dla SMP • Synchronizacja • Wybierz najlżejszy mechanizm • Korzystaj z System.Threading.Interlocked • Ostrożnie z Monitor ( C# : lock()VB :SyncBlock ) • Używaj blokady współdzielonej tylko gdy niezbędna( ReaderWriterLock() ) • Korzystaj z wywołań asynchronicznych - • Dla lepszego odbioru wydajności aplikacji… 6 6a
Biblioteki : ASP.NET • Caching • <%@OutputCache..%>: czas, parametry, nagłówek • Przechowywanie fragmentów - UserControls • API System.Web.Caching.Cache • Powiązania z plikiem, folderem lub Object, callback • Stan sesji – właściwy model • Inproc/server/database/none, warto ReadOnly • Stan formularza (viewstate) – tylko gdy potrzebny • dla strony / kontrolki : EnableViewState = “false” • Migracja ( dawne ASP działa w STA ) • dyrektywa <%@ Page AspCompat=„true” %> • wczesne wiązanie zamiast Server.CreateObject(…) • Zamiast COM STA : zarządzane klasy opakowujące, port
Biblioteki : .NET Remoting • Optymalizacje : • Stosuj wywołania zbiorcze zamiast pojedynczych • użyj TCP/binary ( ale uwaga na zabezpieczenia ) • Aktywacja przez serwer • SingleCall – bezstanowy, brak synchronizacji, inicjalizacja • Singleton – najlżejszy, wymaga synchronizacji • Aktywacja przez klienta • CAO – serwer utrzymuje stan • Remoting WebServices • „rich type fidelity” standardy http://msdn.microsoft.com/library/en-us/dnbda/html/bdadotnetarch14.asp
Biblioteki : Enterprise Services • Korzystaj z usług ES jeśli są niezbędne • Korzystaj z aplikacji bibliotecznych COM+ • Komponenty CLR w ES są komponentami CLR • unikaj finalizatora • Object Pooling : wywołuj Dispose() 7
Plan • Definicje wydajności • Optymalizacje CLR • Optymalizacje bibliotek • Optymalizacje .NET Framework • Narzędzia
.NET Framework : JIT • JIT optymalizuje kod dla konkretnego modelu procesora • Działa na poziomie metod ( You pay for what You use ) • Optymalizacje : • method inlining : 32 B IL, bez funkcji wirtualnych, SEH, struktur, proste instrukcje sterujące • Eliminacja sprawdzania zakresu : nie przechowuj rozmiarów • śledzenie użycia zmiennych/param. – max 64 ( rejestry CPU ) • propagacja stałych, kopiowania, usuwanie poza pętle • Brak optymalizacji w środowisku Visual Studio • Prekompilacja przez NGEN.exe skraca uruchomienie • W trakcie instalacji lub na żądanie • Jeśli prekompilacja – tylko na maszynie docelowej ! • UWAGA : zastosowanie NGEN.EXE może spowolnić wykonanie
.NET Framework : GC hosting • Dwie wersje środowiska CLR : • Workstation GC ( mscorwks.dll ) • Jednowątkowy z usypianiem • Optymalizacja : minimalne opóźnienia • Server GC ( mscorsvr.dll ) • Wielowątkowe z wydziedziczaniem, synchroniczny • Optymalizacja : przepustowość, CPU cache & thread affinity • Osobne regiony na zarządzanej stercie - fragmentacja • Wyższa wydajność odśmiecania niż wersja wks • .NET Application Domains wykonują się wewnątrz hosta • IE, Explorer używają mscorwks.dll • ASP.NET uzywa mscorsvr.dll • DIY jeśli potrzebny mscorsvr.dll … ( przykład w MSDN ) • Do It Yourself… ( przykład w MSDN )
Plan • Definicje wydajności • Optymalizacje CLR • Optymalizacje bibliotek • Optymalizacje .NET Framework • Narzędzia
Narzędzia : PerfMon, inne • Miara wykorzystania zasobów • Środowiska testowe / produkcyjne • Czytelnie skategoryzowane • Możemy tworzyć własne liczniki • Allocation Profiler • Na witrynie http://www.gotdotnet.com/ • Intel: VTune • http://developer.intel.com/ • NuMega: DevPartner Profiler • http://www.compuware.com/products/numega/dps/profiler/ • Rational Software: Quantify • http://www.rational.com/
Podsumowanie • CLR: • Garbage Collector – „profil” alokacji • Reference / Value Types, boxing • Reflection - późne wiązanie • Structured Exception Handling • Biblioteki • Typy znakowe, Typy tablicowe • Wielowątkowość - pula wątków, blokowanie • ASP.NET – stan sesji, viewstate, caching • Enterprise Services – oszczędnie, aplikacje library • Performance counters – gdy zmierzysz, uwierzysz • Polecamy Windows 2003 / .NET Framework 1.1 • ZNACZNIE lepsze mechanizmy SMP, obsługa 3GB
Bibliografia • Microsoft Developer Network • Subskrybcja, MSDN Online • Witryny tematycznehttp://www.develop.com/http://www.gotdotnet.comhttp://www.asp.net • Newsgroups • microsoft.public.dotnet.* • microsoft.public.pl.developer • microsoft.public.dotnet.framework.performance • oraz publikacje Microsoft Press