~~REVEAL~~ ====== Profilowanie programów i odpluskwianie pamięci ====== ===== ===== * **Profilowanie** dynamiczna analiza programu, która dokonuje pomiaru złożoności czasowej lub/i pamięciowej w czasie jego działania \\ [[http://en.wikipedia.org/wiki/List_of_performance_analysis_tools|List of performance analysis tools]] * **Debbuger pamięci** narzędzie do poszukiwania wycieków pamięci i innych błędów związanych z niedozwolonym dostępęm do dynamicznie przydzielanych obszarów pamięci (np. buffer overflow) \\ [[wp>Memory_debugger|Lista debbugerów pamięci]] ===== Profilowanie ===== * Pomaga zlokalizować funkcje lub fragmenty kodu na które należy zwrócić uwagę przy optymalizacji szybkości działania programu * Czy warto optymalizować? * Funkcje wołane tysiące razy * Funkcje najbardziej kosztowne obliczeniowo * Operacje wpływające na responsywność GUI * Aplikacje uruchamiane na urządzeniach o mocno ograniczonych zasobach * Profilowanie pomaga też często wykrywać błędy i lokalizować wady konstrukcji programu (np. niespodziewane wywołania funkcji lub brak wywołań) ===== Techniki profilowania ===== * **instrumentacja**, wstrzykiwanie do kodu instrukcji monitorujących (np. logi, liczniki wywołań, itp.) * profilowanie **oparte na zdarzeniach** * metody **statystyczne**, próbkowanie rejestru [[wp>Program_counter|Program counter]] * **symulacja**, uruchamianie programu w symulowanym środowisku wirtualnym, [[wp>instruction set simulator]] (ISS) ===== Instrumentacja ===== * Instrumentacja polega na dodawaniu instrukcji służacych do uzyskania informacji o wydajności aplikacji * liczniki instrukcji, wywołań funkcji i innych zdarzeń (performance counters) * zastępowanie funkcji alokujących pamięć * opakowanie wywołań funkcji odpowiednimi mechanizmami zliczającymi i mieżącymi czas wywołań ===== ===== * Instrumentacja pozwala na: * precyzyjne śledzenie wykonywanych instrukcji * pomiar czasu wywołań w czasie działania programu * debbugowanie i wyłapywanie sytuacji wyjątkowych * logging * Możliwe problemy: * duży wpływ na wydajność programu profilowanego * plik wykonywalny jest o wiele większy * pomiar może zaburzać wynik, \\ np. [[wp>Heisenbug]] - błąd znikająy w czasie debbugowania ===== Rodzaje instrumentacji ===== * Ręczna, dokonywana przez programistę (logi, assercje) * Automatyczna modyfikacja kodu (Parasoft, Insure%%++%%) * Instrumentacja kodu pośredniego, dodawana do assembly lub po dessaemblacji * Z wykorzystaniem kompilatorów, symbole debuggera umieszczene w kodzie maszynowym * Binarna, instrumentacja dodawana do kodu maszynowego (ATOM) * W czasie działania: * w momencie uruchamiania, program działa pod nadzorem narzędzia profilującego (Valgrind) * kod modyfikowany w czasie wykonywania (DynInst) ===== Event-based profile ===== * Profilowanie oparte na przechwytywanych zdarzeniach, np. tworzenie obiektów, wywołanie metod, odpalenie wątków * Zakładanie haków (hooks), przechwytywanie komunikatów * .NET dołącza agenta profilującego jako serwer COM do CLR (Profiling API) * Środowisko uruchomieniowe dostarcza informacji do agenta o wywołaniach metod, utworzeniu obiektów, itd. * Agent profilujący potrafi podmienić bytecode profilowanego programu w odpowiedni sposób ===== Metody statystyczne ===== * Próbkowanie rejestru procesora wskazującego pozycję programu ([[wp>Program_counter|Program counter]]) za pomocą przerwań systemu operacyjnego z pewną częstością * Metoda w małym stopniu lub wcale nie ingeruje w kod i wykonanie programu * Mniej dokładny pomiar ale pozwala na śledzenie działania programu profilowanego niemal z pełną szybkością. * Wyniki są przybliżeniem statystycznym i obarczone są błędem pomiarowym * Rozdzielczość pomiaru (ziarnistość danych): zależy od częstości próbkowania. Szybko wykonujące się funkcje będą niezauważalne ===== Sposoby raportowania ===== * **Profil**: ogólne statystyki zaobserwowanych zdarzeń, np. zliczenie wywołań poszczególnych instrukcji. Raport zazwyczaj zawiera zestawienie kodu z liczbą wywołań. * **Ślad** (trace), ciąg zaobserwowanych zdarzeń, uwzględnia zależności czasowe także dla programów równoległych. Rozmiar raportu sprawia, że często niepraktyczny w zastosowaniach. * Ciągły monitoring na maszynie wirtualnej. Pozwala uruchamiać śledzenie ścieżek w dowolnym momencie, śledzenie na żywo zmian w wydajności, mechanizmy usypiania procesów asynchronicznych w celu dokładniejszego obejrzenia równoległych procesów ===== Narzędzia do profilowania VS ===== * **Diagnostic Tools** - profilowanie w czasie debbugowania, od VS 2015 * CPU usage, Memory Usage, zdarzenia IntelliTrace * Profilowanie bez debbugera (wersji Release) * Performance wizard: Sampling, Instrumentation, Concurrency, .NET memory, Tier interaction * Narzędzia dostępne od VS2015: CPU usage, GPU usage, Memory uage, Application Lifetime, Network usage, Energy consumption, Java Sript memory, HTML UI responsivenessi * MSDN: [[https://msdn.microsoft.com/en-us/library/mt210448.aspx|VS 2015 Profiling Tools]] ===== Diagnostic Tools ===== {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/1300.2_DiagToolsWindowAndGraphs_thumb_3F439DF9.png}} ===== ===== * użycie CPU i pamięci * zdarzenia InteliTrae oraz debbugera * analiza zawartości sterty w wybranym momencie * porównywanie zawartości sterty pomiędzy zrzutami (snapshots) * profilowanie wywołań funkcji * filtrowanie wyników względem wątków ===== IntelliTrace ====== **IntelliTrace** rejestruje zdarzenia zachodzące w czasie wykonywania aplikacji {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/5852.5_IntelliTraceEvents_thumb_22622B37.png}} ===== Linia czasu zdarzeń ===== {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/4010.tracks.png}} ===== Zdarzenia IntelliTrace ===== Konfiguracja zdarzeń InteliTrace \\ **Tools -> Options -> IntelliTrace** {{zajecia:znd:vs2015_intellitrace_options.png?700}} ===== Podgląd stanu sterty ===== Po zatrzymaniu debbugowania można wykonać migawkę (snapshot) i obejrzeć zawartość sterty {{zajecia:znd:vs2015_diagnostic_memory_heap.png?700}} ===== Porównywanie zawartości sterty ===== {{zajecia:znd:vs2015_diagnostic_memory_cmp.png?700}} ===== Profilowanie użycia CPU ===== {{zajecia:znd:vs_2015_diagnostic_cpu_usage.png?700}} ===== PerfTips ===== **PerfTips** - informacje o czasie wykonań fragmentów kodu umieszczonymi pomiędzy punktami przerwań debbugera {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/00/45/92/metablogapi/4657.2_PerfTips_Hover_thumb_6CC891C1.png}} ===== Proflowanie bez debbugera ===== * Odpluskwianie ma duży wpływ na wydajność aplikacji i zaburza wyniki, dlatego istotne jest użycie narzędzi profilujących dla wersji Release * **Debug -> Start Diagnostic Tools Without Debbuging** * Performance Wizard: narzędzia znane z VS2013 * Aplication Timeline - profilowanie wątków interfejsu użytkonika dla WPF, UWA * Network Usage - użycie sieci dla UWA * CPU, GPU, Memory usage * JavaScript Memory (UWA) * HTML UI responsiveness - wydajność UI dla aplikacji webowych (UWA) ===== ===== Od VS2015 profilowanie dostępne w menu **Debug**\\ **Debug -> Start Diagnostic Tools Without Debbuging** {{zajecia:znd:vs2015_performance_tools.png?700}} ===== VS 2013 Profiling Tools ===== Performance wizard: * **Sampling** zbiera dane statystyczne dotyczące wykonywanej aplikacji próbkując obciążenie CPU i stan stosu (można uwzględnić CPU/Windows counters) * **Instrumentation** - pomiary wywołania poszczególnych funkcji * **Concurrency** aplikacje wielowątkowe * **.NET memory** użycie pamięci i //garbage collection// * **Tier interaction** zawołania ADO.NET do baz danych SQL Serwera ===== Wymagania ===== * Uprawnienia administracyjne - wymagane przez metody próbkowania (sampling) oraz mające dostęp do wywołań systemowych * Skompilowanie aplikacji do wersji **Release** * Debug symbols files (.pdb) - m.in. definicja nazw funkcji systemowych * Visual Studio 2012/2013/2015 Professional/Premium/Ultimate/Enterprise * Brak wsparcia dla Windows 8/10, Windows Server 2012, WPF, UWP, wymagają innych technik profilowania ===== Performance Session ===== {{ :zajecia:znd_2014_1:profiler_explorer.png?300|}} **Perforamnce Explorer**: \\ konfiguracja sesji, \\ uruchamianie testów, \\ porównywanie raportów * **Performance Session** - konfiguracja analizy + raporty * **Targets** - cel analizy: projekt, proces, plik wykonywalny * **Reports** - informacje zebrane podczas analizy * **Attach/Detach** - podłączenie profilowania do działającego procesu ===== Raport ===== {{ :zajecia:znd_2014_1:profiler_summary.png?650 |}} * **Hot Path** najaktywniejsza ścieżka drzewa wywołań funkcji * Lista funkcji wykonujących najwięcej pracy * ''Inclusive'' - łącznie dla całej funkcji, ''Exclusive'' - po odjęciu funkcji wołanych z wnętrza analizowanej funkcji ===== Sampling ===== * W stałych odstępach czasu pobiera z CPU stan stosu * Próbkowanie: domyślnie co 10M cykli (0.01 s dla 1GHz), inne możliwe zdarzenia do próbkowania: \\ błędy stronicowania, wywołania systemowe, performance counters (CPU counters) * Licznik ''inclusive'' zwiększany dla wszystkich funkcji znajdujących się w czasie pomiaru na stosie * Licznik ''exclusive'' zwiększany tylko dla funkcji aktualnie wykonywanej (ze szczytu stosu) * ''Inclusive samples'' - całkowita liczba próbek zebranych dla danej funnkcji * ''Exclusive samples'' - liczba próbek pobranych w czasie gdy funkcja była wykonywana ===== Instrumentation ===== * Pomiar czasu wykonania funkcji, linii kodu i poszczególnych instrukcji * Wstrzykiwany kod na początku i końcu badanych funkcji, mierzony jest czas pomiędzy kolejnymi zdarzeniami * Sprawdzane jest czy pomiędzy zdarzeniami system dokonywał innych operacji (np. odczyt z dysku, komunikacja miedzy wątkami, ...) * Dla każdego zarejestrowanego interwału odtwarzany jest stos wywołań w celu określenia funkcji potomnych ===== ===== * ''Elapsed Inclusive'' - czas wykonania danej funkcji * ''Elapsed Exclisive'' - czas z pominięciem czasu funkcji potomnych * ''Application Inlcusive'' - czas wywołań w czasie których nie nastąpiło wywołanie systemowe * ''Application Exclusive'' - jak wyżej, z pominięciem czasów funkcji potomnych ===== Szczegóły analizy funkcji ===== {{ :zajecia:znd_2014_1:profiler_function_details.png?700 |}} ===== Error List ===== * Okno ''Error List'' zawiera ostrzeżenia i wskazówki dotyczące efektywności aplikacji * [[http://msdn.microsoft.com/en-us/library/ee843874.aspx|Performance Rules]]: błędy, ostrzeżenia, informacje {{ :zajecia:znd_2014_1:profiler_errors.png?600 |}} ===== Filtrowanie wyników ===== {{ http://i.msdn.microsoft.com/dynimg/IC359349.png }}\\ Źródło: http://msdn.microsoft.com ===== CPU and Windows Counters ===== * VS Profiler pozwala zbierać informacje o zdarzeniach systemu (windows counters, events) i procesora (CPU counters) * Windows counters - zdarzenia dostarczane przez infrastrukturę diagnostyczną systemu, w zależności od konfiguracji nie muszą występować. Dostarczają informacji o wydajności OS, aplikacji, usług i sterowników * CPU counters - zdarzenia związane ze sprzętem zliczane przez CPU * Portable Performance counter * Platform Events - specyficzne dla danej architektury, nie przenośne ===== Memory Allocation and Object Lifetime ===== * Zbiera informacje o rozmiarze i liczbie alokowanych obiektów i obiektów niszczonych w garbage collector * Zachowuje stan stosu dla każdego takiego zdarzenia * ''Inclusive Sample Count'' - liczba zdarzeń alokacji obiektu gdy funkcja znajdowała się na stosie * ''Exclusive Sample Count'' - liczba zdarzeń alokacji obiektu gdy funkcja była wywoływana (była na szczycie stosu) * ''Object Lifetime view'' - ilość i rozmiar zaalokowanych obiektów oraz informacja o generacji GC w której zostały //zniszczone// ===== Raport ===== {{zajecia:npr:vs_memory_profiler1.png?700}} ===== ===== * Całkowita zajętość pamięci * Funkcje, które zaalokowały najwięcej pamięci * Lista typów obiektów zajmujących najwięcej miejsca * Lista typów posiadających najwięcej instancji ===== Porównywanie raportów ===== {{ :zajecia:znd_2014_1:profiler_cmp.png?650 |}} ===== Application Timeline ===== * profilowanie aplikacji WPF i UWA * UI thread utilization, Visual throughput (frame rate) {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/38/64/metablogapi/8267.Grpahs_thumb_06CFBBEF.png}} ===== Timeline details ===== * XAML: Layout, Parsing, Render * System: Disk, Network * Other: Garbage Collection {{https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/38/64/metablogapi/0247.UI-Enhancements_thumb_3B70182A.png}} ===== Narzędzia od jetBrains ===== | dotMemory | dotTrace | | {{https://confluence.jetbrains.com/download/attachments/51968323/overview_1.png?340|}} | {{https://www.jetbrains.com/profiler/img/screenshots/timeline_profiling_main.png?350|}} | * [[https://www.jetbrains.com/dotmemory/|dotMemory]] Smart and reliable .NET memory profiler * [[https://www.jetbrains.com/dotmemory/unit/|dotMemory Unit]] * [[https://www.jetbrains.com/profiler/|dotTrace]] ===== Podsumowanie ===== * Profilowanie pozwala wskazać fragmenty kodu, które należy rozpatrzyć pod względem optymalizacji * Dynamiczna analiza: sprawdzane tylko te elementy, które zostały wykoane * Profilowanie jest kosztowne czasowo i pamięciowo * Profilowanie jest obarczone błędami, każda technika ma swoje ograniczenia ===== Więcej informacji ===== * [[http://msdn.microsoft.com/en-us/library/ms182372.aspx|Beginners Guide to Performance Profiling]] * [[http://msdn.microsoft.com/en-us/library/z9z62c29.aspx|Analyzing Application Performance by Using Profiling Tools]] * [[http://msdn.microsoft.com/en-us/magazine/cc337887.aspx|Find Application Bottlenecks with Visual Studio Profiler]] by Hari Pulapaka and Boris Vidolov * [[wp>Profiling_%28computer_programming%29|Profilowanie - Profiling (computer programming)]] * [[http://en.wikipedia.org/wiki/List_of_performance_analysis_tools]]