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?
c++
performance
profiling
OysterD
źródło
źródło
Odpowiedzi:
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.
źródło
Linux: Google Perftools
źródło
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.
źródło
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.
źródło
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?)
źródło
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.
źródło
bez wątpienia oprofile; jego prosty, niezawodny, spełnia swoje zadanie i może dostarczać różnego rodzaju ładnych zestawień danych.
źródło
Profiler w Visual Studio 2008 jest bardzo dobry: szybki, przyjazny dla użytkownika, przejrzysty i dobrze zintegrowany z IDE.
źródło
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:
Będziesz dość zaskoczony, gdy znajdziesz wąskie gardła, ponieważ prawdopodobnie nie są tam, gdzie się spodziewałeś!
źródło
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.
źródło
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.
źródło
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.
źródło
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.
źródło
Używam devpartnera na platformie PC.
źródło
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”.
źródło
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.
źródło
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.
źródło
ElectricFence działa dobrze do debugowania malloc
źródło
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.
źródło
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.
źródło
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/
źródło