Zdaję sobie sprawę, że próbujesz wdrożyć zbieranie statystyk czasu wykonania - takie rzeczy, jak liczba wysłanych bajtów, czas pracy i liczba aktywacji określonej funkcji przez użytkownika.
Zazwyczaj w celu kompilowania statystyk wykonawczych takich jak te z różnych źródeł (takich jak wątki robocze), chciałbym, aby każde źródło (wątek) zwiększało własne, lokalne liczniki najbardziej podstawowych danych, ale nie wykonywało ich jakakolwiek długa matematyka lub analiza tych danych.
Następnie z powrotem w wątku głównym (lub w dowolnym miejscu, w którym statystyki te mają być analizowane & wyświetlane), wysyłam wiadomość typu RequestProgress
do każdego wątku roboczego.W odpowiedzi wątki robocze zbierają wszystkie podstawowe dane i być może przeprowadzają prostą analizę. Te dane, wraz z wynikami analizy podstawowej, są odsyłane z powrotem do wątku wnioskującego (głównego) w komunikacie ProgressReport
. Główny wątek agreguje następnie wszystkie te dane, wykonuje dodatkową (prawdopodobnie kosztowną) analizę, formatowanie i wyświetlanie użytkownikowi lub protokołowi.
Główny wątek wysyła tę wiadomość RequestProgress
na żądanie użytkownika (np. Po naciśnięciu klawisza S
) lub w interwale czasowym. Jeśli chodzi o przedział czasowy, zazwyczaj używam nowego wątku "pulsu". Cały wątek ma numer Sleep()
przez określony czas, a następnie wyślij wiadomość Heartbeat
do wątku głównego. Główny wątek z kolei działa na ten komunikat Heartbeat
wysyłając komunikaty RequestProgress
do każdego wątku roboczego, z którego mają być zbierane statystyki.
Akt zbierania statystyk wydaje się być dość prosty. Dlaczego więc taki złożony mechanizm? Odpowiedź jest dwojakie.
Po pierwsze, wątki robocze mają zadanie do wykonania, a obliczanie statystyk użytkowania nie jest to. Próbując naprawić te wątki, aby wziąć na siebie drugą odpowiedzialność, ortoganalia do ich głównego celu jest trochę jak próba zacięcia kwadratowego kołka do okrągłej dziury. Nie zostały zbudowane, aby to zrobić, więc kod będzie odporny na pisanie.
Po drugie, obliczanie statystyk czasu wykonania może być kosztowne, jeśli spróbujesz zrobić zbyt wiele, zbyt często. Załóżmy na przykład, że masz wątek roboczy, który wysyła dane multiemisji w sieci i chcesz zbierać dane o przepustowości. Ile bajtów, ile czasu i średnia liczba bajtów na sekundę. Możliwe, że wątek roboczy wylicza to wszystko w locie, ale jest to dużo pracy i czas procesora jest lepiej wydany przez wątek roboczy, który robi to, co powinien - wysyłając dane multiemisji. Jeśli zamiast tego po prostu zwiększysz licznik o ile bajtów wysłałeś przy każdym wysłaniu wiadomości, to zliczanie ma minimalny wpływ na wydajność wątku. Następnie w odpowiedzi na okazjonalnym RequestProgress
wiadomości można dowiedzieć początku & razy zatrzymywać i wysłać tylko, że wraz pozwolić wątek główny zrobi wszystko Division itp
by gprof być obsługiwane? -pg na kompilatorze GCC? – pyCthon
Tak, to jedna rzecz, którą mamy. Chociaż mój problem dotyczyłby programu, który działa przez bardzo długi czas (usługa), więc statystyki powinny być dostępne w czasie wykonywania :-) – Gui13
Szkoda, że nie można dodać kolejnego tagu "osadzonego". –