Jeśli profiler nie jest odpowiedzią, jakie mamy inne możliwości?

Po obejrzeniu prezentacji" Performance Anxiety"Joshuy Blocha, przeczytałem artykuł, który zasugerował w prezentacji "Evaluating the Accuracy of Java Profilers" . Cytując wniosek:

Nasze wyniki są niepokojące, ponieważ wskazują, że niepoprawność profilera jest wszechobecna-występująca w większości naszych siedmiu benchmarków i w dwóch produkcyjnych JVM-i znacząca-wszystkich czterech najnowocześniejsze profilery wytwarzają nieprawidłowe profile. Niepoprawne profile mogą łatwo spowodować analityk wydajności poświęcić czas optymalizacji zimnych metod, które będą miały minimalny wpływ na wydajność. Pokazujemy, że proof-of-concept profiler, który nie używa punkty za pobieranie próbek nie cierpią z powodu powyższych problemów

Wniosek artykułu jest taki, że nie możemy naprawdę uwierzyć w wynik profilerów. Ale jaka jest alternatywa korzystania z profilerów. Powinniśmy wrócić i wykorzystać nasze uczucia do optymalizacji?

UPDATE : Punktem, który wydaje się być pominięty w dyskusji jest efekt obserwatora. Czy możemy zbudować profiler, który naprawdę 'efekt obserwatora ' - za darmo?

Author: nanda, 2010-12-08

5 answers

Od czego zacząć?

Po pierwsze, jestem zdumiony, że to jest wiadomość. Po drugie, problem nie polega na tym, że profilery są złe, ale na tym, że niektóre profilery są złe. Autorzy zbudowali taki, który, ich zdaniem, jest dobry, po prostu unikając niektórych błędów, które znaleźli w ocenianych. Błędy są częste z powodu uporczywych mitów na temat profilowania wydajności. Ale bądźmy optymistami. Jeśli ktoś chce znaleźć możliwości speedup, to jest naprawdę bardzo proste:
  • Pobieranie Próbek powinno być nieskorelowane ze stanem programu.
    Oznacza to, że dzieje się to w naprawdę losowym czasie, niezależnie od tego, czy program znajduje się we I/O (z wyjątkiem danych wejściowych użytkownika), czy w GC, czy w ciasnej pętli procesora, czy cokolwiek innego.

  • Próbkowanie powinno odczytać stos wywołań funkcji ,
    aby określić, które stwierdzenia były "aktywne" w momencie próby. Powodem jest to, że każda strona wywołująca (punkt, w którym funkcja jest called) ma koszt procentowy równy ułamkowi czasu, jaki znajduje się na stosie. (Uwaga: artykuł dotyczy wyłącznie czasu własnego, ignorując ogromny wpływ możliwych do uniknięcia wywołań funkcji w dużym oprogramowaniu. W rzeczywistości, powodem oryginału gprof była pomoc w znalezieniu tych połączeń.)

  • Raportowanie powinno pokazywać procent według linii (nie według funkcji).
    Jeśli zostanie zidentyfikowana funkcja "gorąca", nadal trzeba upolować w niej "gorące" linie kodu odpowiadające czas. Ta informacja jest w próbkach ! Po co to ukrywać?

Omyłką niemal uniwersalną (którą dzieli papier) jest zbyt duża dbałość o dokładność pomiaru , a za mało o dokładność miejsca . Na przykład, Oto przykład strojenia wydajności w którym zidentyfikowano i naprawiono szereg problemów z wydajnością, co skutkowało 43-krotnym przyspieszeniem. Nie było konieczne dokładne poznanie wielkości każdego problem przed naprawą, ale znać jego lokalizację. Zjawisko dostrajania wydajności polega na tym, że naprawienie jednego problemu, poprzez skrócenie czasu, powiększa odsetek pozostałych problemów, dzięki czemu są łatwiejsze do znalezienia. Tak długo, jak Każdy problem zostanie znaleziony i naprawiony, postęp jest w kierunku celu znalezienia i naprawienia wszystkich problemów. Nie jest konieczne, aby naprawić je w porządku malejącej wielkości, ale ważne jest, aby je wskazać.

Na temat dokładności statystycznej pomiar, jeśli punkt wywoławczy znajduje się na stosie jakiś procent czasu F (jak 20%), A N(jak 100) próbki w czasie losowym są pobierane, to liczba próbek, które pokazują punkt wywoławczy jest rozkład dwumianowy, ze średnią = NF = 20, odchylenie standardowe = sqrt(NF (1-F)) = sqrt (16) = 4. Więc procent próbek, które pokazują, że będzie 20% + / - 4%. Czy to prawda? Nie bardzo, ale czy problem został znaleziony? Dokładnie.

W rzeczywistości, im większy problem, jeśli chodzi o procent, tym mniej próbek są potrzebne, aby go zlokalizować. Na przykład, jeśli pobrane zostaną 3 próbki, a na 2 z nich pojawi się punkt wywoławczy, najprawdopodobniej będzie to bardzo kosztowne. (W szczególności następuje Dystrybucja beta. Jeśli wygenerujesz 4 jednorodne 0,1 liczby losowe i posortujesz je, rozkład trzeciego jest rozkładem kosztów dla tego punktu wywoławczego. To wredne jest (2+1)/(3+2) = 0.6, więc to jest oczekiwane oszczędności, biorąc pod uwagę te próbki.) Wstawiony: a czynnik speedup jaki otrzymujesz jest regulowany przez inną dystrybucję, BetaPrime, ijego średnia wynosi 4. Więc jeśli weźmiesz 3 próbki, zobaczysz problem na 2 z nich i wyeliminujesz ten problem, średnio stworzysz program cztery razy szybciej.

Najwyższy czas, żebyśmy Programiści wydmuchali sobie pajęczyny z głowy na temat profilowania.

Zastrzeżenie - artykuł nie odwołał się do mojego artykułu: Dunlavey, "strojenie wydajności z kosztem na poziomie instrukcji pochodzącym z próbkowania stosu połączeń", ACM SIGPLAN Notices 42, 8 (Sierpień 2007), s. 4-8.

 40
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:08

Jeśli dobrze przeczytałem, artykuł mówi tylko o profilowaniu opartym na próbkach. Wielu profilerów wykonuje również profilowanie oparte na oprzyrządowaniu. Jest znacznie wolniejszy i ma inne problemy, ale nie powinien cierpieć z powodu uprzedzeń, o których mówi Gazeta.

Wniosek artykułu jest taki, że my nie mogę uwierzyć w wynik profilerzy. Ale co to jest alternatywa stosowania profilerów.

Nie. Wniosek z artykułu jest taki, że obecni profilerzy" metody pomiarowe mają określone wady. Proponują rozwiązanie. Gazeta jest całkiem niedawno. Spodziewałbym się, że profilerzy w końcu zaimplementują tę poprawkę. Do tego czasu, nawet wadliwy profiler jestnadal znacznie lepszy niż"uczucie".

 8
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-08 13:56:04

Jeśli nie budujesz aplikacji, które potrzebują każdego cyklu procesora, to odkryłem, że profilery są dobrym sposobem na znalezienie 10% najwolniejszych części kodu. Jako deweloper, chciałbym argumentować, że powinno być wszystko, co naprawdę zależy w prawie wszystkich przypadkach.

Mam doświadczenie z http://www.dynatrace.com/en i mogę ci powiedzieć, że jest bardzo dobry w znajdowaniu nisko wiszących owoców.

Profilery są jak każde inne narzędzie i mają swoje dziwactwa, ale ja bym zaufaj im nad człowiekiem każdego dnia, aby znaleźć hot spoty w aplikacji do oglądania.

 3
Author: Andrew White,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-23 20:28:05

Jeśli nie ufasz profilerom, możesz przejść do trybu paranoi, używając programowania aspect oriented, owijając każdą metodę w aplikacji, a następnie używając loggera do rejestrowania każdego wywołania metody.

Twoja aplikacja naprawdę spowolni, ale przynajmniej będziesz miał dokładny licznik, ile razy każda metoda jest wywoływana. Jeśli chcesz zobaczyć, ile czasu zajmuje wykonanie każdej metody, owiń ją wokół każdej metody perf4j.

Po wyrzuceniu tych wszystkich statystyki do plików tekstowych, użyj niektórych narzędzi, aby wyodrębnić wszystkie niezbędne informacje, a następnie je wizualizować. Myślę, że to da ci całkiem dobry przegląd tego, jak powolna jest Twoja aplikacja w niektórych miejscach.

 -1
Author: darioo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-08 13:39:51

Właściwie, lepiej profilować na poziomie bazy danych. Większość firmowych baz danych ma możliwość wyświetlania najważniejszych zapytań w danym okresie czasu. Zacznij pracować nad tymi zapytaniami, dopóki najlepsze z nich nie zmniejszą się do 300 ms lub mniej, a zrobisz duży postęp. Profilery są przydatne do pokazywania zachowania sterty i do identyfikacji zablokowanych wątków, ale osobiście nigdy nie dostałem wiele przyczepności z zespołami programistycznymi w identyfikowaniu gorących metod lub dużych obiektów.

 -3
Author: Mike Bonar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-03 02:58:03