Profiler
Aby znaleźć "wąskie gardło" programu można posłużyć się profilerem.
Większość kompilatorów ma swoje profilery. Istnieją też zewnętrzne np.
AQtime, Intel VTune, AMD CodeXL, AMD CodeAnalyst.
Rodzaje profilerów:
- Instrumentacja - kompilator dodaje kawałek kodu do każdej funkcji,
który zlicza liczbę wywołań, czas wykonania itd.
- Debugging - profiler dodaje breakpoint w każdej funkcji lub nawet w każdej linii i mierzy czasy wykonania.
- Time based sampling - system operacyjny generuje przerwania np. co milisekundę a profiler sprawdza
w jakiej funkcji znajduje się wtedy program. Nie wymaga to zmian w programie ale jest mniej wiarygodne.
- Event-based sampling - profiler ustawia generowanie przerwań gdy nastąpi jakieś zdarzenie
np. co każde 1000 nietrafień w bufor, złe przewidzenie rozgałezienia, rzucenie wyjątku.
Czasami najlepsze rezultaty daje własnoręczne dodanie liczników do wybranych funkcji czy miejsc.
Częste problemy z pofilerami:
- Za mała dokładność pomiaru czasu,
- Zbyt krótki lub zbyt długi czas wykonania (za mało lub za dużo danych do analizy),
- Czekanie na odpowiedź użytkownika lub innych komputerów (testować na przygotowanych danych z pliku)
- Zbyt duża optymalizacja może uniemożliwić rozpoznawanie wykonywanych funkcji (fałszywe raporty),
- Testowanie wersji debug, która nie jest zoptymalizowana,
- Skoki pomiędzy rdzeniami (można przypisać wątek do danego rdzenia),
- Mała powtarzalność (opóźnienia związane z przełączaniem zadań, garbage collection).