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?


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:



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

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.


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.


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


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.


5

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


5

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


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ś!


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.


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.


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.


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.



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”.


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.


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.



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.


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.


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/

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.