2008-09-16 10 views
7

Nie jest niczym niezwykłym, że mam program, którego wydajność zależy w dużej mierze od kilku funkcji i chcę być w stanie zmierzyć prędkość pojedynczej pętli lub segmentu kodu do pojedynczej taktowania, aby wiedzieć, czy moje zmiany rzeczywiście poprawiają się wydajność lub czy po prostu przychodzę do placebo "zoptymalizowanego" kodu.Jakie jest twoje ulubione narzędzie do profilowania niskiego poziomu?

Osobiście używam ffmpeg'a "bench.h", zestawu makr C, które używają rdtsc do pomiaru czasu zegara i automatycznie kompensuje przełączniki kontekstowe i podobne. Oczywiście takie podejście ma swoje słabości; jakie inne metody profilowania niskopoziomowego robią użytkownicy StackOverflow?

Odpowiedz

2

Nie robię teraz programowania niskiego poziomu, ale gdybym to zrobił, na pewno zaglądałbym do dtrace; z tego, co przeczytałem, wygląda niezwykle interesująco. Dla użytkowników OS X jest też shark.

0

to moje narzędzie do wyboru w systemach opartych na Uniksie.

0

Głównym problemem jest to, że podczas kompilacji w benchmarkingu potencjalnie modyfikujesz wyniki (w zależności od tego, jak i kiedy wdrożenie). A z tymi niskimi poziomami prawdopodobnie jesteś pod silnym wpływem optymalizacji twojego kompilatora.

Ale osobiście w Linuksie mam słabość do oprofilowania (oprofile) jest to systemowy profiler, który jest osadzony jako moduł jądra i okresowo śledzi miejsce, w którym aplikacja spędza czas. Oznacza to, że profiluje cały system, a nie tylko jedną aplikację. Ale może być tak, że nie zapewnia wystarczającej ziarnistości.

0

Nie radzę programować kodu, aby go profilować. Najlepszą odpowiedzią na to byłoby użycie PTU (Performance Tuning Utility) firmy Intel, można ją znaleźć tutaj:

To narzędzie jest bezpośrednim potomkiem VTune i udostępnia najlepszy dostępny profiler pobierania próbek. Będziesz w stanie śledzić, gdzie zużywa się procesor lub tracić czas (przy pomocy dostępnych zdarzeń sprzętowych), i to bez spowolnienia aplikacji lub perturbacji profilu.

1

valgrind już wspomniano, ale jest szczególnie przydatna przy pomocy narzędzia callgrind:

$ valgrind --tool=callgrind your_program 

Następnie można użyć KCacheGrind do wizualizacji danych.

0

Dla systemu Linux: Google Perftools

  • Szybciej niż valgrind (jeszcze nie tak drobnoziarnista)
  • Nie wymaga instrumentacji kodu
  • Nicea wyjście graficzny (-> kcachegrind)
  • Does profilowanie pamięci, profilowanie cpu, sprawdzanie szczelności
0

OK, opisujesz gorącą -spot sytuacja - ciasna pętla, która zajmuje dużą część czasu i nie zawiera wywołań funkcji.

Chcesz wiedzieć, czy wprowadzone zmiany mają jakikolwiek wpływ.

Oto co zrobię:

  • Aby zobaczyć, co zmienić, aby szybciej, dwa sposoby, z kością proste:

1) Single-krok po wewnętrznej pętli , aby zobaczyć dokładnie, co robi i dlaczego. Szanse są całkiem dobre. Zobaczę pewne rzeczy, które można zrobić lepiej.

i/lub

2) Pobierz pracuje w dużej zewnętrznej pętli, a następnie przerywać to ręcznie. Zrób to kilka razy. Instrukcje/stwierdzenia, które wyjaśniają najwięcej czasu pojawią się w tych próbkach w przybliżeniu proporcjonalnie do ich kosztu.

  • Aby stwierdzić, czy zrobiłem żadnej różnicy, inna technika kości proste:

Run to miliard razy w zewnętrznej pętli i liczyć sekundy. To mówi, ile nanosekund zajmuje wewnętrzna pętla.