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

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

instrumentacja, wstrzykiwanie do kodu instrukcji monitorujących (np. logi, liczniki wywołań, itp.)

profilowanie oparte na zdarzeniach

metody statystyczne, próbkowanie rejestru Program counter

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

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. Heisenbug - błąd znikająy w czasie debbugowania

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)

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

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łędem pomiarowym

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

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

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: VS 2015 Profiling Tools

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 rejestruje zdarzenia zachodzące w czasie wykonywania aplikacji

Konfiguracja zdarzeń InteliTrace
Tools -> Options -> IntelliTrace

Po zatrzymaniu debbugowania można wykonać migawkę (snapshot) i obejrzeć zawartość sterty

PerfTips - informacje o czasie wykonań fragmentów kodu umieszczonymi pomiędzy punktami przerwań 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

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

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

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

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

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

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

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

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

Źródło: http://msdn.microsoft.com

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

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

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

profilowanie aplikacji WPF i UWA

UI thread utilization, Visual throughput (frame rate)

XAML: Layout, Parsing, Render

System: Disk, Network

Other: Garbage Collection

dotMemory	dotTrace

dotMemory Smart and reliable .NET memory profiler

dotMemory Unit

dotTrace

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

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