Profilowanie wydajności Javy

Porównanie czterech narzędzi programistycznych do profilowania aplikacji.

Porównanie czterech narzędzi programistycznych do profilowania aplikacji.

Strojenie aplikacji to raczej praktykowanie sztuk magicznych niż nauka, ale programy do profilowania - narzędzia pozwalające na pomiar szybkości różnych części kodu - pozwolą na uzyskanie zadowalających wyników.

Jak na ironię, te same użyteczne techniki programowania obiektowego, które przyspieszają opracowanie aplikacji, tak znacznie zmniejszają ich ostateczną wydajność. Praktyka dogodna podczas opracowania aplikacji - wywoływanie wielu metod, enkapsulacja danych, używanie bogatego interfejsu użytkowego, tworzenie wielu obiektów i dopuszczenie, aby ich zarządzaniem zajmował się moduł usuwania ich z pamięci - może być powodem koszmarów już po uruchomieniu aplikacji.

Programy profilujące działają w różny sposób, ale wszystkie informują programistę, ile czasu wykonuje się konkretna metoda. Ta informacja pozwala mu znaleźć wąskie gardła i nieefektywne moduły, nad którymi należy popracować.

Porównano właściwości czterech programów do profilowania wydajności Javy, działających na Windows NT: JProbe 1.1.1 (firmy KL Group); profiler załączony do pakietu narzędziowego Sun Java Workshop 2.0; Visual Quantify 4.1 (Rational Software) i VTune 3.0 Intela. Visual Quantify może również służyć do profilowania programów napisanych w Visual C++ i Visual Basicu, a VTune pozwala testować programy napisane w C/C++, Fortranie i asemblerze x86.

Każdy z programów dostarcza graficznej informacji o wydajności poszczególnych metod w programie. Sun pokazuje wykres paskowy wydajności przy nazwie każdej metody. Każdy z programów informuje również, jaka metoda wywołała konkretną metodę i które metody ta z kolei wywołuje. Ponadto każdy z programów, z wyjątkiem Java Workshop, dostarcza graficzną mapę wywołań, pokazującą zależności między modułami aplikacji. Może to być przydatne w złożonej aplikacji.

Programy profilujące zbierają dane z aplikacji w różny sposób i tu zaczynają uwydatniać się różnice. Najpowszechniej stosuje się dwie techniki: próbkowania (lub przeglądania) i instrumentalizacji. Próbkowanie wymaga okresowego uruchamiania i stopowania aplikacji, np. co 50 ms, w celu sprawdzenia, które metody są wykonywane i jakie są zależności wywołań.

Poważną wadą metody próbkowania, zwłaszcza jeśli czas próbkowania nie jest znacznie krótszy od czasu trwania zdarzeń, które należy pomierzyć, jest niebezpieczeństwo popełnienia dużych błędów w pomiarach. Ponieważ niektóre metody wykonują się w czasie pojedynczych mikrosekund, czas ich wykonania może być znacznie zaniżony, mimo że ich całkowity udział w wykonaniu programu jest duży.

Na przykład w małym programie testowym mała metoda rekursywna wykonuje się w ciągu ok. 1 mikrosekundy, ale ponieważ wywołuje się ona wielokrotnie, zajmowała aż 65% czasu wykonania aplikacji. Dla tego przypadku próbkowanie daje wyniki błędne; jednak dla większości programów metoda jest skuteczna. Java Workshop stosuje wyłącznie metodę próbkowania, zaś VTune pozwala programiście na wybranie metody, zależnie od sytuacji i natury aplikacji.

Inna technika pomiarowa, "instrumentalizacja", polega na dodaniu dodatkowego kodu, pozwalającego programowi profilującemu na obliczenie czasu wykonania metody. Producenci wprowadzają ten dodatkowy kod do maszyny wirtualnej Java lub do aplikacji klienta albo do obydwu. Instrumentalizacja jest bardziej dokładna, gdyż żaden etap programu, nawet najmniejszy, nie będzie pominięty. Z drugiej strony, taka operacja zajmuje wiele czasu, co powoduje, że zanim doda się kod do dużej aplikacji, minie wiele czasu.

JProbe stosuje własną wersję zinstrumentalizowanej maszyny wirtualnej Java firmy Sun. Pozwala to na podawanie informacji, ile czasu wykonują się poszczególne metody, jak często są wywoływane, co znajduje się na stosie, jak używa się pamięci. Informacje o czasie wykonania podawane są z dokładnością do pojedynczych kodów maszyny wirtualnej, zapewniając profilowanie kodu wiersz po wierszu. JProbe podaje również informacje o zajętości pamięci i liczbie wywołanych instancji obiektów. Zbyt duża liczba czynnych instancji obiektów może być przyczyną małej wydajności aplikacji, cecha ta jest więc bardzo cenna.

Visual Quantify stosuje maszynę wirtualną Java Microsoftu i korzysta z jej API w celu zbierania informacji o szybkości metod. Program profilujący przestawia tę maszynę w tryb profilowania pozwalający na uzyskanie potrzebnych informacji.