Jakie jest Twoje ulubione narzędzie do profilowania (dla C ++) [zamknięte]

83

Jak dotąd korzystałem tylko z Rational Quantify. Słyszałem świetne rzeczy o Intel VTune, ale nigdy go nie próbowałem!

Edycja: głównie szukam oprogramowania, które będzie instrumentować kod, ponieważ myślę, że to jedyny sposób na uzyskanie bardzo dobrych wyników.


Zobacz też:

Jakie są dobre programy profilujące dla natywnego języka C ++ w systemie Windows?

OysterD
źródło
Czy chcesz 1) zmierzyć, czy chcesz 2) znaleźć przyspieszenia? Jeśli chcesz 2, a myślisz, że wymaga to 1, tak nie jest. Aby znaleźć przyspieszenia, nie potrzebujesz „bardzo dobrych wyników”. Jeśli program spędza 90% swojego czasu na robieniu czegoś, co możesz bardzo dobrze usunąć, gdybyś wiedział, co to jest, próbki stosu pokażą ci to 9 razy na 10. Jeśli spojrzysz na 10 próbek, czy obchodzi Cię, czy widzisz to 10 razy, 9 razy czy 8 razy? Tak czy inaczej, wiesz, co to jest . Zmierzony procent nie ma znaczenia.
Mike Dunlavey

Odpowiedzi:

35

Do programowania pod Linuksem (chociaż niektóre z tych narzędzi mogą działać na innych platformach). Są to dwie wielkie nazwiska, które znam, jest wiele innych mniejszych, które od jakiegoś czasu nie były aktywnie rozwijane.

Glin.
źródło
28

Linux: Google Perftools

  • Szybszy niż valgrind (jeszcze nie tak drobnoziarnisty)
  • Nie wymaga instrumentacji kodu
  • Ładne wyjście graficzne (-> kcachegrind)
  • Czy profilowanie pamięci, profilowanie procesora, sprawdzanie wycieków
Weidenrinde
źródło
9

IMHO, próbkowanie za pomocą debuggera jest najlepszą metodą. Wszystko, czego potrzebujesz, to IDE lub debugger, który pozwoli ci zatrzymać program. Naprawia problemy z wydajnością, zanim jeszcze zainstalujesz profiler.

Mike Dunlavey
źródło
3
Tak! To działa świetnie dla mnie. Nie wymaga oprzyrządowania. Nie wymaga zainstalowanego żadnego profilera itp. W systemie Linux możesz użyć gdb. Program działa z pełną prędkością. Naciśnij ctrl-c, aby zatrzymać. wpisz „bt”, aby wyświetlić ślad stosu. Następnie „c”, aby kontynuować, a następnie ponownie ctrl-c. Działa świetnie! Właśnie zmniejszyłem czas wykonania o 20% w złożonym programie, używając tej techniki. Niesamowite!
Hugh Perkins
@HughPerkins: Dziękuję za zmianę i cieszę się, że Ci się udało. (Założę się, że dasz radę lepiej niż 20% :)
Mike Dunlavey
1
Tak, czas iteracji spadł z 1200 ms do 200 ms, w ciągu kilku godzin pracy, używając tylko gdb + ctrl-c, aby zlokalizować hotspoty :-)
Hugh Perkins
@HughPerkins: Dla mnie, jeśli pracuję nad własnym kodem, trudno jest wiedzieć, kiedy przestać próbować - wygląda na to, że zawsze mogę go jeszcze wycisnąć. Kiedy pracuję nad kodem innej osoby, może wystąpić problem. Nie zawsze mogę przekonać „właściciela” kodu do rozwiązania problemu, więc proces się zatrzymuje. To interesująca zagadka.
Mike Dunlavey
Jeśli chcesz to osiągnąć bez oprzyrządowania, nie potrzebujesz nawet debuggera ani IDE w systemie Linux. Po prostu uruchom "pstack <pid>", aby śledzić na stosie bieżące instrukcje. Jest to o wiele prostsze niż uruchomienie Debugera, a następnie ręczne przerwanie i szukanie śledzenia stosu.
Manish Sogi
7

Moje jedyne doświadczenie w profilowaniu kodu C ++ dotyczy AQTime firmy AutomatedQA (obecnie SmartBear Software). Ma kilka wbudowanych typów profilerów (wydajność, pamięć, uchwyty systemu Windows, śledzenie wyjątków, analiza statyczna itp.) I instrumentuje kod w celu uzyskania wyników.

Podobało mi się jego używanie - zawsze fajnie było znaleźć te miejsca, w których niewielka zmiana w kodzie może spowodować radykalną poprawę wydajności.

Matt Dillard
źródło
Niestety działa to tylko w systemie Windows.
Bram
6

Nigdy wcześniej nie robiłem profilowania. Wczoraj zaprogramowałem klasę ProfilingTimer ze statycznym harmonogramem (map <std :: string, long long>) do przechowywania czasu.

Konstruktor przechowuje początkowy tik, a destruktor oblicza upływający czas i dodaje go do mapy:

ProfilingTimer::ProfilingTimer(std::string name)
 : mLocalName(name)
{
 sNestedName += mLocalName;
 sNestedName += " > ";

 if(sTimetable.find(sNestedName) == sTimetable.end())
  sTimetable[sNestedName] = 0;

 mStartTick = Platform::GetTimerTicks();
}

ProfilingTimer::~ProfilingTimer()
{
 long long totalTicks = Platform::GetTimerTicks() - mStartTick;

 sTimetable[sNestedName] += totalTicks;

 sNestedName.erase(sNestedName.length() - mLocalName.length() - 3);
}

W każdej funkcji (lub {bloku}), którą chcę profilować, muszę dodać:

ProfilingTimer _ProfilingTimer("identifier");

Dodanie tej linii do wszystkich funkcji, które chcę profilować, jest nieco kłopotliwe, ponieważ muszę zgadywać, które funkcje zajmują dużo czasu. Ale działa dobrze, a funkcja drukowania pokazuje pochłonięty czas w%.

(Czy ktoś jeszcze pracuje nad podobnymi „domowymi profilami”? Czy jest to po prostu głupie? Ale to fajna zabawa! Czy ktoś ma sugestie ulepszeń?

Czy jest jakiś rodzaj automatycznego dodawania linii do wszystkich funkcji?)

Moberg
źródło
5

Użyłem Glowcode intensywnie i miałem z nim tylko pozytywne doświadczenia. Jego integracja z Visual Studio jest naprawdę fajna i jest to najbardziej wydajny / intuicyjny profiler, jakiego kiedykolwiek używałem (nawet w porównaniu do profilerów dla kodu zarządzanego).

Oczywiście jest to bezużyteczne, jeśli nie korzystasz z systemu Windows, ale pytanie nie jest dla mnie jasne, jakie są Twoje wymagania.

jsight
źródło
5

bez wątpienia oprofile; jego prosty, niezawodny, spełnia swoje zadanie i może dostarczać różnego rodzaju ładnych zestawień danych.

Dark Shikari
źródło
5

Profiler w Visual Studio 2008 jest bardzo dobry: szybki, przyjazny dla użytkownika, przejrzysty i dobrze zintegrowany z IDE.

Dimitri C.
źródło
2
Czy profiler nie jest tylko w wersji Team?
dwj
@dwj: Nie jestem pewien. Używam Visual Studio Team System 2008 Development Edition.
Dimitri C.
Wygląda na to, że jest tylko w edycji Team ( stackoverflow.com/questions/61669/… ) dla wersji sprzed 2010 roku.
dwj
4

W przypadku systemu Windows sprawdź Xperf . Wykorzystuje profil próbkowany, ma przydatny interfejs użytkownika i nie wymaga oprzyrządowania. Całkiem przydatne do śledzenia problemów z wydajnością. Możesz odpowiedzieć na pytania takie jak:

  • Kto używa najwięcej procesora? Przejdź do nazwy funkcji za pomocą stosów wywołań.
  • Kto przydziela najwięcej pamięci?
  • Kto wykonuje najwięcej zapytań w rejestrze?
  • Dysk zapisuje? itp.

Będziesz dość zaskoczony, gdy znajdziesz wąskie gardła, ponieważ prawdopodobnie nie są tam, gdzie się spodziewałeś!

user15071
źródło
4

W systemie Windows wypróbowałem AMD Codeanalyst, Intel VTune i profiler w Visual Studio Team Edition.

Codeanalyst zawiera błędy (często się zawiesza), a w moim kodzie jego wyniki są często niedokładne. Jego interfejs użytkownika jest nieintuicyjny. Na przykład, aby dotrzeć do stosu wywołań wyświetlanego w wynikach profilu, należy kliknąć kartę „Procesy”, a następnie kliknąć nazwę pliku EXE swojego programu, a następnie kliknąć przycisk paska narzędzi z małymi literami „CSS”. Jest jednak darmowy, więc równie dobrze możesz go wypróbować i działa (z mniejszą liczbą funkcji) bez procesora AMD.

VTune (700 USD) ma okropny interfejs użytkownika IMO; w dużym programie trudno jest znaleźć określone drzewo wywołań, które chcesz, i możesz patrzeć tylko na jeden „węzeł” w programie na raz (funkcję z jej bezpośrednimi wywołania i wywołania) - nie możesz spojrzeć na kompletne drzewo wywołań. Jest widok wykresu połączeń, ale nie mogłem znaleźć sposobu, aby wyświetlić na wykresie względne czasy wykonania. Innymi słowy, funkcje na wykresie wyglądają tak samo bez względu na to, ile czasu w nich spędzono - to tak, jakby całkowicie pominęły sens profilowania.

Profiler programu Visual Studio ma najlepszy GUI z trzech, ale z jakiegoś powodu nie jest w stanie zebrać próbek z większości mojego kodu (próbki są zbierane tylko dla kilku funkcji w całym moim programie C ++). Nie mogłem też znaleźć ceny ani sposobu na bezpośredni zakup; ale pochodzi z subskrypcją MSDN mojej firmy. Visual Studio obsługuje kod zarządzany, natywny i mieszany; Nie jestem pewien co do pozostałych dwóch profilerów w tym względzie.

Podsumowując, nie znam jeszcze dobrego profilera! Na pewno sprawdzę tutaj inne sugestie.

Qwertie
źródło
3

Istnieją różne wymagania dotyczące profilowania. Czy kod instrumentalny jest w porządku, czy też musisz profilować kod zoptymalizowany (lub nawet kod już skompilowany)? Czy potrzebujesz szczegółowych informacji o profilu? Który system operacyjny używasz? Czy musisz również profilować biblioteki współdzielone? A co ze śledzeniem w wywołaniach systemowych?

Osobiście używam oprofile do wszystkiego, co robię, ale może to nie być najlepszy wybór w każdym przypadku. Vtune i Shark również są znakomici.

Louis Brandy
źródło
3

Ponieważ nie wspominasz o platformie, na której pracujesz, powiem cachegrind pod Linuksem. Zdecydowanie. Jest częścią zestawu narzędzi Valgrind.

http://valgrind.org/info/tools.html

Nigdy nie korzystałem z jego podfunkcji Callgrind, ponieważ większość mojej optymalizacji kodu dotyczy funkcji wewnętrznych .

Zauważ, że jest dostępny frontend KCachegrind.

rlerallut
źródło
3

W przypadku programowania w systemie Windows korzystałem z narzędzia do sprawdzania wydajności oprogramowania Software Verification - jest szybkie, w miarę dokładne i niedrogie. Co najlepsze, może instrumentować działający proces i umożliwia włączanie i wyłączanie gromadzenia danych w czasie wykonywania, zarówno ręcznie, jak i na podstawie stosu wywołań - doskonale nadaje się do profilowania małej sekcji większego programu.

Shog9
źródło
3

Używam devpartnera na platformie PC.

EvilTeach
źródło
Obsługuje kod. Ma pokrycie kodu i sprawdzanie granic (instrumentowane i
nieinstrumentowane
2

Wypróbowałem Quantify an AQTime i Quantify wygrał ze względu na jego nieocenione funkcje „skupienia się na poddrzewie” i „usuwania drzewa podrzędnego”.

eli
źródło
Pełne potwierdzenie. Po prostu musiałem przeprowadzić pewne profilowanie w aplikacji C ++ i to były dokładnie te funkcje, które naprawdę sprawiły, że mój dzień.
Enno,
2

Jedyną wrażliwą odpowiedzią jest PTU firmy Intel. Oczywiście najlepiej jest używać go na procesorze Intela i uzyskać jeszcze bardziej wartościowe wyniki, przynajmniej na maszynie C2D, ponieważ sama architektura jest łatwiejsza do zwrócenia znaczących profili.

Fabien Hure
źródło
2

Używam VTune pod Windows i Linux przez wiele lat z bardzo dobrymi wynikami. Późniejsze wersje pogorszyły się, gdy zlecili ten produkt swojej rosyjskiej ekipie programistycznej, jakość i wydajność spadły (zwiększone awarie VTune, często ponad 15 minut na otwarcie pliku analizy).

Jeśli chodzi o oprzyrządowanie, może się okazać, że jest mniej przydatne niż myślisz. W aplikacjach, nad którymi pracowałem, dodawanie oprzyrządowania często spowalnia produkt tak bardzo, że już nie działa (prawdziwa historia: uruchom aplikację, idź do domu, wróć następnego dnia, aplikacja wciąż się inicjalizuje). Ponadto dzięki nieoprzyrządowanemu profilowaniu możesz reagować na problemy na żywo. Na przykład dzięki zdalnemu kolektorowi dat VTune mogę rozpocząć sesję próbkowania na serwerze na żywo z setkami jednoczesnych połączeń, na których występują problemy z wydajnością i wychwytuje problemy występujące w środowisku produkcyjnym, których nigdy nie byłbym w stanie odtworzyć w środowisku testowym.

Don Neufeld
źródło
2

ElectricFence działa dobrze do debugowania malloc

Michael McCarty
źródło
1

Moim ulubionym narzędziem jest Easy Profiler: http://code.google.com/p/easyprofiler/

Jest to profiler czasu kompilacji: kod źródłowy musi być ręcznie instrumentowany przy użyciu zestawu procedur, aby opisać regiony docelowe. Jednak po uruchomieniu aplikacji i automatycznym zapisaniu pomiarów do pliku XML, wystarczy otworzyć aplikację Observer i wykonać kilka kliknięć w narzędzia do analizy / porównania, zanim zobaczysz wynik na wykresie jakościowym.

charfeddine.ahmed
źródło
1

Visual Studio 2010 Profiler w systemie Windows. VTune miał świetne narzędzie do tworzenia wykresów połączeń, ale zostało zepsute w systemie Windows Vista / 7. Nie wiem, czy to naprawili.

Koder
źródło
0

Podam wtyczkę do EQATEC ... właśnie to, czego szukałem ... proste do nauczenia się i użytkowania oraz daje mi informacje potrzebne do szybkiego znalezienia hotspotów. O wiele wolę to od wbudowanego w Visual Studio (chociaż nie próbowałem jeszcze VS 2010, żeby być uczciwym).

Możliwość robienia migawek jest OGROMNA. Często wykonuję dodatkową analizę i optymalizację, czekając na uruchomienie prawdziwej analizy celu ... uwielbiam to.

Aha, i jego podstawowa wersja jest darmowa!
http://www.eqatec.com/Profiler/

Brian Kennedy
źródło