Używam Yourkit 8.0 do profilowania matematycznie intensywnej aplikacji działającej pod Mac OS X (10.5.7, Apple JDK 1.6.0_06-b06-57) i zauważyłem pewne dziwne zachowanie w wynikach profilowania procesora.Profilowanie natywnych metod w Javie - dziwne wyniki
Na przykład - wykonałem próbę profilowania za pomocą próbkowania, które zgłosiło, że 40% 10-minutowego czasu działania aplikacji zostało wydane w metodzie StrictMath.atan. Znalazłem to zagadkowe, ale wziąłem to pod uwagę i spędziłem trochę czasu zastępując atan wyjątkowo skrajnym wielomianem.
Kiedy ponownie uruchomiłem aplikację, zajęło to prawie dokładnie tyle samo co poprzednio (10 minut) - ale mój zamiennik atanu nie pojawił się w wynikach profilowania. Zamiast tego, wartości procentowe runtime innych głównych hotspotów po prostu wzrosły, aby to nadrobić.
Podsumowując
wyniki z StrictMath.atan (metoda podstawowa)
Całkowity czas trwania: 10 minut
Metoda 1: 20%
metoda 2: 20%
Metoda 3: 20%
StrictMath.atan: 40%
wyniki z uproszczonej, czystej Javie ATAN
Łączny czas trwania: 10 minu tes
Metoda 1: 33%
Metoda 2: 33%
Metoda 3: 33%
(Metody 1,2,3 nie wykonywać żadnych połączeń Atan)
Każdy pomysł co jest z tym zachowaniem? Otrzymałem te same wyniki przy użyciu JProfiler firmy EJ-Technologies. Wygląda na to, że interfejs API profilowania JDK zgłasza niedokładne wyniki dla natywnych metod, przynajmniej w OS X.
Nie byłbym zaskoczony, gdyby 'atan' był nieodłączny - zamiast wywoływania metody, odpowiadający kod maszynowy jest wstrzykiwany inline. –
Doświadczyłem tego również z różnymi metodami w StrictMath na Mac OS X 10.7 (i wcześniejszych wersjach też). –
Czy istnieje rozwiązanie tego problemu? – ziggystar