Co to jest dobry, łatwy w użyciu program profilujący dla C ++ w systemie Linux? [Zamknięte]


79

Muszę sprofilować kod działający w C ++ w systemie Linux. Czy możecie polecić jakieś profilery?


1
Powinieneś dodać tagi Linux i C ++. Prawdopodobnie uzyskasz lepszą odpowiedź i zakres opinii.
Duck


np. likwid, LLTng, oprofile, valgrind, vtune, gprof, perf, gperftools, pTop
Shan.

Zobacz to pytanie na slant
ideasman42

Odpowiedzi:


37

Użyj gprof.

Po prostu skompiluj z -pgflagą (myślę (ale nie jestem pewien), że musisz wyłączyć optymalizacje.) I użyj gprof do analizy pliku gmon.out, który następnie utworzy twój plik wykonywalny.

na przykład:

gcc -pg -o whatever whatever.c

./whatever

gprof whatever gmon.out

To samo z g ++ i cpp.


32
Profilowanie niezoptymalizowanego kodu jest trochę bezcelowe, prawda? Podobnie, kod profilujący, który został mocno zmodyfikowany za pomocą -pg, często wprowadza Cię w błąd w optymalizacji niewłaściwych miejsc.
federalny

1
-pg jest opcją konsolidatora, a nie kompilatorem
Slug Pue

24

Valgrind to dobrze znany program do profilowania Linuksa


myślałem, że Valgrind był bardziej do sprawdzania wycieków pamięci. Próbuję zobaczyć, które funkcje są wywoływane itp.
shergill

14
użyj narzędzia suite nazwie "callgrind"
dfa

2
Valgrind to po prostu framework do budowania narzędzi dynamicznych. Chociaż stało się synonimem Memcheck, narzędzia zbudowanego na Valgrind. Callgrind jest całkiem niezły w profilowaniu.
Falaina


13

Zoom z RotateRight ( http://www.rotateright.com ) jest tym, czego używam. Ma widok motyla na funkcje i możesz dwukrotnie kliknąć dowolną funkcję, aby zanurzyć się w kodzie źródłowym lub ASM. Kompiluj z informacjami debugowania (-g), aby zobaczyć źródło, ale nadal powinieneś budować i profilować kod zoptymalizowany .


1
Właśnie dałem szansę temu programowi, jest naprawdę całkiem niezły! Obecnie mój ulubiony program do profilowania w systemie Linux; jednak warto wspomnieć, że wymaga to zbudowania kodu, -fno-omit-frame-pointeraby skutecznie profilować.
Nik Reiman

1
Link wygląda na martwy. Czy ktoś wie, gdzie (lub czy) można go znaleźć gdzie indziej?
Simon F

12

Jestem fanem Oprofile . Obejmuje instalację modułu jądra i wymaga trochę nauki, ale jest dość potężny i działa bardzo dobrze dla zoptymalizowanych programów / programów bez symboli debugowania.

Vtune to kolejny bardzo potężny program do profilowania stworzony przez firmę Intel. Uważam, że wersja dla systemu Linux jest bezpłatna dla oprogramowania niekomercyjnego.

Istnieje również zestaw narzędzi Valgrind proponowany przez dfa. Callgrind prawdopodobnie byłby tym, co Cię najbardziej interesuje. Cachegrind (którego zestaw funkcji jest podzbiorem Callgrinda) i Massif również są interesujące, ale nie mam doświadczenia z tym drugim.


+1 dla oprofile, to nie jest „łatwe narzędzie”
dfa

1
Haha, prawda. Prawdopodobnie nie powinienem sprawiać, by brzmiało to tak łatwo :) Z pewnością nie jest to tak proste, jak „uruchamianie programu pod nim”, jak narzędzia Vtune i Valgrind, ale wydaje mi się, że przyzwyczajasz się do tego dość szybko.
Falaina

oprofile wygląda interesująco - czy obsługuje x86_64?
LiraNuna

VTune nie jest niestety darmowy do żadnych zastosowań.
rustyx



2

gprof to standardowe narzędzie GNU do profilowania.


2

Spójrz na Sysprof . Twoja dystrybucja najprawdopodobniej już jest dostępna.

Zauważ, że wszystkie wymienione programy profilujące działają najlepiej, jeśli Twoja aplikacja jest skompilowana ze wskaźnikami ramek. Oznacza to, że powinieneś użyć -fno-omit-frame-pointer w linii poleceń gcc.


1

po prostu opierasz swoją ocenę wąskiego gardła na 10 próbkach pobranych ręcznie, zamiast 1000 próbek zebranych przez prof.
Dmitrij Grigoriew

1
@DmitryGrigoryev: Dobrze, i to faktycznie mówi ci, co powinieneś naprawić. Wyjaśnienie statystyczne jest tutaj . W rzeczywistości pierwszym błędem, jaki popełniają ludzie, jest myślenie, że szukają raczej „wąskiego gardła” niż doskonale dobrego, ale marnotrawnego kodu ;-)
Mike Dunlavey

Niezła lektura, dzięki. Całkowicie rozumiem, że optymalizacja jest znacznie łatwiejsza, gdy widzisz rzeczywiste wywołanie funkcji w debugerze. I rozumiem, że „wąskie gardło” nie oznacza „dobrego celu optymalizacji”, tylko potencjalny. Mimo to myślę, że warto zacząć od tego, co i proftak: jeśli widzę, że f()jest to najbardziej problematyczna funkcja statystycznie, zatrzymam program kilka razy, aż wyląduję, f()zamiast po prostu zaczynać od losowej funkcji, w której najpierw zatrzymałem się.
Dmitrij Grigoriew
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.