Profiler – narzędzie dewelopera cz. I

Profiler czy Profiler Control to narzędzie znane już od wersji V9 Progressa. Było dostępne w postaci źródłowej z katalogu DLC\src\samples\profile, a w późniejszych wersjach dodane do pakietu samples, który można pobrać oddzielnie. Jest to deweloperskie narzędzie darmowe i niewspierane. Wielu klientów korzysta z niego na całym świecie. Zostałem niedawno poproszony o przypomnienie jak rozpocząć z nim pracę, co opiszę w niniejszym artykule.

Profiler jest powszechnym i użytecznym narzędziem programisty do oceny wydajności aplikacji. Krótko mówiąc, profiler dostarcza „profil” konkretnego wykonania programu czyli informacje o czasach wykonania poszczególnych modułów oraz kolejność ich wywołań; dzięki czemu można przeanalizować, gdzie program spędza większość czasu i jaka część aplikacji wywołuje inną część aplikacji. W szczególności możemy przeanalizować czas wykonań dla konkretnych zapytań lub znaleźć podejrzanie dużą liczbę iteracji dla instrukcji.

Narzędzie to składa się z dwóch modułów – modułu zbierającego dane oraz modułu graficznego (Windows), w którym można te dane analizować. Profiler śledzi opóźnienia w aplikacji spowodowane przez kod programu ignorując jednocześnie te wywołane interakcją użytkownika.

Pierwsza wersja tego narzędzia wymagała utworzenia pustej bazy prof.db i załadowania do niej definicji z pliku prof.df. Ja przedstawię tutaj nowszą wersję, w której baza nie jest potrzebna gdyż wszystkie dane są gromadzone w tablicach tymczasowych.
Wersja ta zawiera graficzny interfejs użytkownika, który upraszcza uruchamianie i zatrzymywanie procedur. Może wykrywać czy jest uruchomiony Progress Dynamics a także umożliwia uruchamianie dynamicznych kontenerów oraz statycznych smart obiektów i innych procedur. Zawiera wszystkie te same informacje, ale eliminuje znaczną część złożoności poprzedniego narzędzia, eliminując czasochłonne ładowanie danych profilu. Do statystyk wykonania, dodano więcej informacji. To narzędzie zawiera również dodatkową funkcjonalność, która daje użytkownikowi możliwość wykonywania porównań i eksportowania danych do zewnętrznych programów. Można go pobrać tutaj.

W niniejszym artykule oprócz wprowadzenia i informacji ogólnych znajdziecie metody jak rozpocząć z nim pracę. W styczniu natomiast napiszę jak interpretować dane.

W zasadzie są dwie metody generowania danych dla profilera: uruchamiając narzędzie z parametrem startowym -profile lub używając handle (uchwyt) PROFILER. Najprostszym sposobem jest uruchomienie pliku profiler.w, co widać powyżej. Program ten uruchamiany jest bezparametrowo ale wykorzystuje on wspomniany uchwyt.
Pojawi się komunikat czy uruchomić sesję profilera. Jeśli potwierdzicie, przełącznik radiowy ustawi się w pozycji Profile, jeśli nie, w pozycji Run.
Wybieramy Profile i w polu Procedure wpisujemy nazwę profilowanej procedury (nie ma niestety drzewa systemu z plikami do wyboru). Oprócz pola procedury widać także pole Container. Jest ono aktywne gdy mamy otwartą sesję z produktem Progress Dynamics. Domyślnie narzędzie jest ustawione tak aby śledzić dane dla sesji klient-serwer lecz jest też możliwe śledzenie sesji dla klient-appserver dla Dynamics.

Po wpisaniu nazwy programu i naciśnięciu Run, dane zostaną zapisane do pliku, którego nazwa jest generowana automatycznie (możemy ją oczywiście zmienić). W tym przypadku clntprof20221227.out. Po zakończeniu procesu wybierz przycisk Stop. Spowoduje to, że program profilujący zakończy działanie procedury (o ile nadal działa) a dane sesji zostaną wyeksportuje pliku wyjściowego (jeśli zaznaczone jest pole Write On Stop). Dane można także zapisać w dowolnym momencie naciskając przycisk Write Data.

Możemy sami skorzystać z uchwytu PROFILER. Ta metoda jest wygodna jeśli chcemy programowo profilować tylko wybrane fragmenty kodu. Wymaga ona więcej pracy ale daje dodatkowe możliwości i w przypadku złożonych programów jest nieoceniona. Przykładowy fragment kodu widzimy poniżej.

ASSIGN
   PROFILER:DESCRIPTION = "Profiler Start"
   PROFILER:DIRECTORY = "c:/WrkOpenEdge126/"
   PROFILER:FILE-NAME = "clntprof20221227.out"
   PROFILER:COVERAGE = TRUE
   PROFILER:LISTINGS = TRUE
   PROFILER:ENABLED = TRUE
   PROFILER:PROFILING = TRUE.

Jeśli chcemy profilować dane całej aplikacji, możemy skorzystać z parametru startowego -profile profiler.txt który wstawiamy do ikonki lub skryptu uruchamiającego procedurę.

W piku profiler.txt definiujemy parametry np:

   -description "Profiler Start"
   -listings = "c:/WrkOpenEdge126/"
   -filename = "clntprof20221227.out"

OK, to na razie tyle. Następnym razem zajmiemy się generowaniem i analizą danych.