Pomiar zużycia pamięci i obciążenia procesora przez metodę

0

Witam wszystkich.

Posiadam w swojej aplikacji metodę powiedzmy Process, która wykonuje się przez różny czas, zazwyczaj od 5ms to kilku minut. Dokładnie to rozwiązuje ona metodą brute-force problem komiwojażera.

Potrzebuję zmierzyć w jakiś sposób zużycie procesora przez daną metodę. Jeżeli chodzi o pomiar zużycia pamięci to rozwiązałem to poprzez obliczenie różnicy z wyników metody GC.GetTotalMemory przed i po wykonaniu danej metody. Niestety mam problem ze sposobem pomiaru zużycia procesora. Chciałem użyć PerformanceCounter jednak przy niskim czasie wykonania nie mam możliwości zebrania danych o obciążeniu procesora. Czy ma ktoś jakikolwiek pomysł? Chcę uzyskać jakiekolwiek wartości, na podstawie których będę mógł porównać poziom obciążenia CPU.

1

Czy użycie Benchmark .Net by tutaj nie pomogło?

0

@WeiXiao: dzięki za podpowiedź, zupełnie nie pomyślalem o tej bibliotece! Jednak jak chwilę zerknąłem to na pierwszy rzut oka nie znalazłem tam nic w dokumentacji, co pomogłoby zmierzyć w jakiś sposób zużycie CPU.

0

@lukaszek016:

Czy czasu wykonania nie da się jakoś przełożyć na to, co potrzebujesz?

0

Hmm, no przyznam szczerze, że nie pomyślałem w ten sposób. Obecnie i tak liczę czas wykonania algorytmu poprzez mierzenie, jednak robię to bez zewnętrznych bibliotek używając Stopwatch. Świetny pomysł z tą biblioteką BenchmarkDotNet, na pewno się przyda.

2

BenchmarkDotNet służy do testów wydajnościowych. Jeśli chcemy mierzyć zużycie CPU/RAM przez program, to trzeba użyć profilera. Np. tego od JetBrains, przez 2 tygodnie można pewnie poużywać triala.

0

Po co chcesz mierzyć CPU? Co z tym dalej zrobisz?

0

Chcę zrobić tabelę porównawczą z danymi oraz wykresem jak zmienia się czas wykonania, zużycie pamięci w zależności od ilości "miast" dla różnych algorytmów (brute-force, genetyczny, symulowanego wyżarzania i najbliższego sąsiada). Taki tam studencki projekt :) Liczę się z tym, że pamir CPU jest trochę bez sensu, bo w DiagnosticTools cały czas zużycie jest na tym samym poziomie.

0

Hmm, to po co to implementować wewnątrz procesu? Nie prościej odpalić proces i zmierzyć przez time, albo pobrać metryki bezpośrednio z systemu operacyjnego?

0

Obecnie mój proces to aplikacja konsolowa, ładuje tam plik txt ze współrzędnymi punktów, wybieram algorytm, i aplikacja liczy wybranym algorytmem najkrótszą trasę dla wszystkich liczb punktów. Np. mam plik z dziesięcioma współrzędnymi i wybieram algorytm genetyczny to aplikacja odpala ten algorytm kilka razy, aby policzyć najkrótszą trasę dla 5, 6, 7, 8, 9 i 10 punktów i zapisuje statystyki do csv. Obecnie zaimplementowałem sobie to samo, ale z pomocą BenchmarkDotNet.

Rozwiniesz to o pobraniu metryk z systemu? Nie do końca rozumiem o co dokładnie chodzi?

1

https://docs.microsoft.com/en-us/windows/win32/psapi/collecting-memory-usage-information-for-a-process
https://docs.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps

Albo po prostu measure-command z PowerShella. Można też benchmark.net ale on zmienia działanie aplikacji, więc może się zdarzyć, że w "produkcyjnym" kodzie dostaniesz inne wyniki, niż wołając tę samą metodę z benchmarka. Odpalanie procesu i mierzenie go z zewnątrz gwarantuje, że dostaniesz prawdziwe wyniki (niekoniecznie przenośne na inną maszynę, to też trzeba mieć na uwadze).

0

Rozumiem, spojrzę na linki, które załączyłeś, jednak biblioteka BenchmarkDotNet świetnie mi "przypasowała" ze względu na to, że nie muszę ręcznie pisać nie wiem jakich pętli, aby wywołać moje algorytmy wiele razy dla porównania czasów, tutaj dostarcza mi wszystkich mechanizmów biblioteka.
Co do rozbieżności w wynikach to nie zależy mi na powiązaniu wyniku algorytmu z czasem jego wykonania. Generalnie to jako takie produkcyjnego kodu nie będzie. Odpalam lokalnie, zbieram dane, wrzucam w tabelki i to wszystko.

0

A to w takim razie nie ma co komplikować.

0

W Visual Studio masz wbudowany profiler. Z jego pomocą zobaczysz co ile czasu i pamięci zeżarło z dokładnością co do linijki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1