Opowieść hakera
Data to 02.12.10. Dni przed Bożym Narodzeniem ociekają i jako programista Windows natrafiłem na poważną blokadę. Używałem AQTime, próbowałem śpiący, błyszczący i bardzo senny, a kiedy mówimy, VTune instaluje. Próbowałem użyć profilera VS2008, który był pozytywnie karany, a także często niewrażliwy. Użyłem techniki pauzy losowej. Zbadałem drzewa połączeń. Odpaliłem ślady funkcji. Ale smutnym i bolesnym faktem w tej sprawie jest to, że aplikacja, z którą pracuję, składa się z ponad miliona linii kodu, z prawdopodobnie kolejnym milionem linii aplikacji innych firm.
Potrzebuję lepszych narzędzi. Przeczytałem inne tematy. Wypróbowałem każdy profiler wymieniony w każdym temacie. Po prostu musi być coś lepszego niż te niezdarne i drogie opcje lub absurdalne ilości pracy, która prawie bez zysku. Aby jeszcze bardziej skomplikować sprawę, nasz kod jest mocno podzielony na wątki i uruchamia szereg pętli zdarzeń Qt, z których niektóre są tak delikatne, że ulegają awarii przy dużym obciążeniu instrumentalnym z powodu opóźnień czasowych. Nie pytaj mnie, dlaczego uruchamiamy wiele pętli zdarzeń. Nikt nie może mi powiedzieć.
Czy są jakieś inne opcje podobne do Valgrind w środowisku Windows?
Czy jest coś lepszego niż długi pas zepsutych narzędzi, które już wypróbowałem?
Czy jest coś zaprojektowanego do integracji z Qt, być może z użytecznym wyświetlaniem zdarzeń w kolejce?
Pełna lista narzędzi, które wypróbowałem, z tymi, które były naprawdę przydatne, zapisana kursywą:
- AQTime: Raczej dobrze! Ma pewne problemy z głęboką rekurencją, ale wykres wywołań jest poprawny w takich przypadkach i może być użyty do wyjaśnienia wszelkich nieporozumień. Nie jest to idealne narzędzie, ale warte wypróbowania. Może pasować do twoich potrzeb i na pewno wystarczało mi przez większość czasu.
- Atak z przypadkowym wstrzymaniem w trybie debugowania: za mało informacji w czasie.
Dobre narzędzie, ale nie kompletne rozwiązanie. - Parallel Studios: opcja nuklearna. Natarczywy, dziwny i szalenie potężny. Myślę, że powinieneś zaliczyć 30-dniową ocenę i dowiedzieć się, czy jest to dobre dopasowanie. To też jest cholernie fajne.
- AMD Codeanalyst: Wspaniały, łatwy w użyciu, bardzo podatny na awarie, ale myślę, że to kwestia środowiska. Polecam go wypróbować, ponieważ jest bezpłatny.
- Luke Stackwalker: Działa dobrze w małych projektach, trochę próbuję sprawić, by działało na naszych. Jednak dobre wyniki i zdecydowanie zastępuje Sleepy w moich osobistych zadaniach.
- PurifyPlus: Brak wsparcia dla środowisk Win-x64, przede wszystkim Windows 7. Poza tym doskonała. Wielu moich kolegów z innych działów przysięga na to.
- VS2008 Profiler: Produkuje dane wyjściowe w zakresie 100 + gigów w trybie śledzenia funkcji przy wymaganej rozdzielczości. Z drugiej strony daje solidne wyniki.
- GProf: Wymaga nawet umiarkowanie skutecznego GCC.
- VTune: wsparcie W7 VTune graniczy z przestępczością. Poza tym doskonale
- PIN: musiałbym zhakować własne narzędzie, więc jest to ostateczność.
- Sleepy \ VerySleepy: Przydatne w przypadku mniejszych aplikacji, ale mnie tu zawodzi.
- EasyProfiler: Nieźle, jeśli nie przeszkadza ci trochę ręcznie wprowadzony kod wskazujący, gdzie instrumentować.
- Valgrind: * tylko nix, ale bardzo dobrze, gdy jesteś w takim środowisku.
- OProfile: tylko Linux.
- Proffy: Strzelają do dzikich koni.
Sugerowane narzędzia, których nie wypróbowałem:
- XPerf:
- Glowcode:
- Devpartner:
Uwagi: Środowisko Intel w tej chwili. VS2008, zwiększ biblioteki. Qt 4+. I nędzny humdinger z nich wszystkich: integracja Qt / MFC za pośrednictwem trolltech.
Teraz: prawie dwa tygodnie później wygląda na to, że mój problem został rozwiązany. Dzięki różnorodnym narzędziom, w tym prawie wszystkim na liście i kilku moim osobistym sztuczkom, znaleźliśmy główne wąskie gardła. Jednak zamierzam nadal testować, odkrywać i wypróbowywać nowe profile, a także nowe technologie. Czemu? Ponieważ jestem wam to winien, bo rządzicie. Trochę spowalnia to oś czasu, ale nadal jestem bardzo podekscytowany możliwością dalszego wypróbowywania nowych narzędzi.
Opis
Wśród wielu innych problemów, ostatnio przełączono szereg komponentów na niewłaściwy model wątków, co spowodowało poważne zawieszanie się, ponieważ kod pod nami nagle przestał być wielowątkowy. Nie mogę powiedzieć więcej, ponieważ narusza to moją umowę o zachowaniu poufności, ale mogę powiedzieć, że nigdy nie zostałoby to znalezione podczas zwykłej inspekcji ani nawet podczas normalnego przeglądu kodu. Bez profilerów, kaligrafów i przypadkowych pauz w połączeniu nadal wykrzykiwalibyśmy naszą furię na piękny niebieski łuk nieba. Na szczęście pracuję z jednymi z najlepszych hakerów, jakich kiedykolwiek spotkałem, i mam dostęp do niesamowitego wersetu pełnego świetnych narzędzi i wspaniałych ludzi.
Gentleholk, ogromnie to doceniam i żałuję tylko, że nie mam wystarczającej liczby reputacji, aby wynagrodzić każdego z was nagrodą. Nadal uważam, że jest to ważne pytanie, aby uzyskać lepszą odpowiedź niż te, które otrzymaliśmy do tej pory w SO.
W rezultacie co tydzień przez następne trzy tygodnie będę wnosił największą nagrodę, na jaką mnie stać, i nagradzać ją najmilszym narzędziem, o którym myślę, że nie jest powszechnie znana. Miejmy nadzieję, że po trzech tygodniach uzyskamy ostateczny profil osób zajmujących się profilowaniem, jeśli wybaczycie mi moją karę.
Na wynos
Użyj profilera. Są wystarczająco dobre dla Ritchiego, Kernighana, Bentleya i Knutha. Nie obchodzi mnie, kim myślisz, że jesteś. Użyj profilera. Jeśli ten, który masz, nie działa, znajdź inny. Jeśli nie możesz go znaleźć, wpisz jeden. Jeśli nie możesz go zakodować, jest to małe rozłączenie lub po prostu utknąłeś, użyj losowej pauzy. Jeśli wszystko inne zawiedzie, zatrudnij kilku absolwentów, aby wybili profilera.
Dłuższy widok
Pomyślałem więc, że fajnie byłoby napisać trochę retrospektywy. Zdecydowałem się na intensywną współpracę z Parallel Studios, po części dlatego, że w rzeczywistości jest ono oparte na narzędziu PIN. Mając kontakty naukowe z niektórymi zaangażowanymi badaczami, czułem, że jest to prawdopodobnie znak jakiejś jakości. Na szczęście miałem rację. Chociaż GUI jest trochę okropne, okazało się, że IPS jest niesamowicie przydatny, chociaż nie mogę go wygodnie polecić wszystkim. Krytycznie, nie ma oczywistego sposobu, aby uzyskać liczbę trafień na poziomie linii, coś, co zapewnia AQT i wiele innych profilerów, i stwierdziłem, że jest bardzo przydatny do badania między innymi współczynnika wyboru gałęzi. W sieci również podobało mi się używanie AQTime i zauważyłem, że ich wsparcie jest naprawdę responsywne. Ponownie muszę zakwalifikować moją rekomendację: Wiele ich funkcji nie działa tak dobrze, a niektóre z nich są wręcz podatne na awarie w systemie Win7x64. XPerf również działał znakomicie, ale jest boleśnie powolny, jeśli chodzi o szczegóły próbkowania wymagane do uzyskania dobrych odczytów w niektórych rodzajach aplikacji.
W tej chwili muszę powiedzieć, że nie sądzę, aby istniała ostateczna opcja profilowania kodu C ++ w środowisku W7x64, ale z pewnością istnieją opcje, które po prostu nie wykonują żadnej użytecznej usługi.