Profiler skończony!

Nareszcie, po ponad tygodniowej przerwie, zabrałem się za kod. Do napisania w planach miałem profiler. Wczoraj powstał interfejs, dzisiaj implementacja. Jest to pierwszy profiler, jaki w życiu napisałem. Po wstępnych testach wszystko wskazuje na to, że działa całkiem poprawnie, ale - jak to zwykle bywa - wszystkie ewentualne niedoróbki ujawnią się w trakcie używania. Narzędzie, które napisałem zbiera następujące statystyki:
  • Czas rzeczywisty trwania profilowanego bloku (w milisekundach)
  • Ilość wywołań danego bloku w ciągu jednej klatki profilowania (np. w ciągu jednego obiegu pętli głównej)
  • Procentowy czas trwania wszystkich wywołań bloku w danej klatce profilowania w stosunku do czasu trwania klatki
Dla każdej z tych statystyk klient ma dostęp do minimalnej, maksymalnej, średniej i ostatnio zmierzonej wartości. Profiler (jak każdy podsystem modernizowanego przeze mnie frameworka) składa się z dwóch oddzielonych elementów - interfejsu i implementacji. Implementacja jest stosunkowo prosta i na pewno mogłaby zostać napisana lepiej i wydajniej, niemniej jednak na razie wystarczy mi taka. Wspomniane rozdzielenie jej od interfejsu pozwoli na łatwą wymianę w przyszłości. Z ciekawych elementów interfejsu profilera można wymienić interfejs iteratora, który służy do przeglądania zapisu historii pomiarów. Iterator ten pozwala klientom przechodzić przez historię nie znając jej wewnętrznej struktury. Zgodnie z opisanymi standardami iterator przechodzi ewentualną strukturę drzewiastą metodą preorder oraz udostępnia informację o poziomie zagnieżdżenia, co pozwala reprezentować ją graficznie (np. wcięciami w tekście). Obecnie jednak implementacja działa na strukturze płaskiej :). Co dalej? Zobaczymy :). Wypadałoby do najbliższej niedzieli zakończyć modernizacje framework'a.