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
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)
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

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

statystyczna, próbkowanie rejestru Program counter

symulacja, instruction set simulator (ISS), uruchamianie programu w symulowanym środowisku wirtualnym

Instrumentacja

Dodawane są instrukcje potrzebne do uzyskania informacji o wydajności aplikacji

liczniki instrukcji i innych zdarzeń (performance counters)

zastępowanie funkcji alokujących pamięć

opakowanie wywołań funkcji odpowiednimi mechanizmami zliczającymi

Pozwala na:

precyzyjne śledzenie wykonywanych instrukcji

pomiar czasu wywołań w czasie działania programu

debbugowanie i wyłapywanie sytuacji wyjątkowych

logging

Duży wpływ na wydajność programu profilowanego, plik wykonywalny jest o wiele większy

Może to też zaburzać pomiar, tzw Heisenbug

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, np. gcc -pg dla gprof, Quantify

Binarna, instrumentacja dodawana do kodu maszynowego (ATOM)

W czasie działania (runtime): instrumentacja w momencie uruchamiania, program działa pod nadzorem narzędzia profilującego (Valgrind, Pin, DynamicRIO), 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)

.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.

Matody statystyczne

Próbkowanie rejestru procesora wskazującego pozycję programu (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łedem pomiarowym

Rozdzielczość pomiaru (ziernistośc danych): zależy od częstości próbkowania. Szybko wykonujące się funkcje bedą niezauważalne

Sposoby raportowania

profil: ogólne statystyki zaobserwowanych zdarzeń, np. zliczenie wywołań poszczególnych instrukcji, wystarczające dla programów sekwencyjnych (jednowątkowych). Raport zazwyczaj zawiera zestawienie kodu z liczbą wywołań więc jego rozmiar jest liniowy względem liczby linii kodu.

ślad (trace), ciąg zaobserwowanych zdarzeń, uwzględnia zależności czasowe także dla programów równoległych. Rozmiar liniowy względem długości ścieżki kodu (instruction path length), z tego względu 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

Wynik działania

płaski (flat) - sumaryczne czasy wywołań poszczególnych instrukcji lub funkcji

graf wywołań (call graph) - uwzględniają kolejność wywołań i pozwalają oddzielić czas działania funkcji wywołującej od funkcji badanej i funkcji potomnych

zależny od wejścia (input sensitive), uzależniają wynik profilowania od rozmiaru i/lub wartości danych wejściowych. Dodają niejako dodatkowy wymiar do profili płaskich i grafów wywołań

Call graph

relacje wywołań pomiędzy funkcjami programu

cykle oznaczają rekujencję

brak informacji o kontekście

Źródło: wikipedia.org

Profilowanie kodu w VS2013

Sampling zbiera dane statystyczne dotyczące wykonywanej aplikacji próbkując obciążenie CPU i stan stosu

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

Performance Session

Okno Perforamnce Explorer: konfiguracja sesji, uruchamianie testów, porównywanie raportów

Performance Session - konfiguracja analizy + raporty

Targets - cel analizy: projekt, działający proces, plik wykonywalny

Reports - pliki zawierające informacje zebrane podczas analizy

Attach/Detach - podłączenie profilowania do działającego procesu

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 Professional/Premium/Ultimate

Windows 8, Windows Server 2012, aplikacje Windows Store - wymagają innych technik profilowania, nie wszystkie wymienione tu są wspierane w VS

Raport

Hot Path najaktywniejsza ścieżka drzewa wywołań funkcji

Lista funkcji wykonujących najwięcej pracy

Inclusive - łącznie dla całej funkcji, i

Exclusive - po odjęciu funkcji wołanych z wnętrza analizowanej funkcji

Sampling

W stałych odstępach czasu pobiera z CPU stan stosu (informacje o autualnie wykonywanych funkcjach)

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)

w czasie próbkowania zwiekszany jest licznik wywołań (inclusive samples) dla wszystkich funkcji ze stosu

Funkcja aktualnie wykonywana otrzymuje zwiększony licznik exclusive sample oraz inclusive sample

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 wykoanania 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

Error List

Okno Error List zawiera ostrzeżenia i wskazówki dotyczące efektywności aplikacji

Performance Rules: błędy, ostrzeżenia, informacje

Filtrowanie wyników

Ż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 infrastrukture diagnostyczną systemu, w zależności od konfiguracji nie muszą wystepować. Dostarczają informacji o wydajności OS, aplikacji, usług i sterowanikó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 niszczoncyh 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

Całkowita zajęcośc 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

Narzędzia od jetBrains

dotMemory	dotTrace

dotMemory Smart and reliable .NET memory profiler

dotMemory Unit

dotTrace

Podsumowanie

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

Beginners Guide to Performance Profiling

Analyzing Application Performance by Using Profiling Tools

Find Application Bottlenecks with Visual Studio Profiler by Hari Pulapaka and Boris Vidolov

Profilowanie - Profiling (computer programming)

http://en.wikipedia.org/wiki/List_of_performance_analysis_tools