2010-03-09 13 views
7

Zostałem zapytany, jak sprawdzić, ile pamięci i procesora używa mój program, i zostałem skierowany do liczników wydajności. Jednak gdy patrzę na dokumentację, zaczyna się od mówienia mi o dostarczaniu danych konsumenckich poprzez tworzenie manifestu dla mojej aplikacji, a moje oczy są lśniące. Miło, że takie narzędzie ogólnego przeznaczenia istnieje, jak sądzę, ale wszystko, czego chciałem, to zestaw funkcji, które powiedziałyby mi, ile pamięci i procesora używa mój program.Czy liczniki wydajności są odpowiednim narzędziem do mojej pracy? Jeśli tak, jak z nich korzystać?

Czy liczniki wydajności są odpowiednim narzędziem do mojej pracy? Jeśli tak, jak z nich korzystać? Naprawdę nie chcę niczego konfigurować poza aplikacją C#.

UWAGA: Nie szukam aplikacji do profilowania innej firmy, potrzebuję danych pamięci i procesora wyświetlanych przez moją aplikację.

AKTUALIZACJA: Usunąłem czas w funkcjach, ponieważ wydawało się to mylące.

+0

"Nie szukam aplikacji do profilowania innej firmy, muszę mieć dane w mojej aplikacji" - to nie ma dla mnie żadnego sensu? –

+0

Mówisz o profilerze. Albo użyj wbudowanego w Visual Studio (jeśli masz tę wersję) lub użyj czegoś takiego jak memprofiler. –

+0

@Mitch: czy teraz pytanie jest jaśniejsze? – Simon

Odpowiedz

1

Liczniki wydajności nie podają czasu, jaki aplikacja spędza w danej funkcji. Do tego możesz użyć jakiejś klasy timera, która zaczyna się na początku funkcji i zatrzymuje się na końcu.

+0

Czy nie jest tak proste, jak dodać DateTime start = DateTime.Now; oraz DateTime end = DateTime.Now; na początku i na końcu tej funkcji? Lub przed i po uruchomieniu. Następnie po prostu wykonaj TimeSpent timespent = end - start; i zrobić trochę logowania lub coś z wartością. – Alxandr

+0

@shoosh: OK, a co z resztą? – Simon

+0

@Alxandr: dokładność milisekundy to za mało, a uzyskanie lepszej rozdzielczości za pomocą stopera trwa tak długo, że wartości są przekrzywione. – Simon

3

Po wyjęciu z pudełka można użyć perfmon do monitorowania wykorzystania procesora, pamięci i dysku oraz wielu liczników wydajności .NET. perfmon ma okna.

Oszklenie oczu jest wymagane tylko wtedy, gdy chcesz napisać własną perfmonię lub jeśli chcesz zaoferować własne liczniki wydajności. Ten ostatni byłby interesujący tylko wtedy, gdyby użytkownicy musieliby monitorować tę wartość (np. Tworzysz aplikację serwera, a użytkownicy muszą upewnić się, że nie ma więcej niż 10% połączeń odrzuconych z powodu nieprawidłowej fazy księżyca).

Aby określić, ile czasu spędzasz na niektórych funkcjach, użyj profilera.


Performance Counter API pozwoli na monitorowanie danych wraz z istniejących liczników wydajności (co może powiedzieć na przykład, że funkcja Foo staje się bardzo powolny każdej nocy po 11, ponieważ jakiś inny proces jest pobicie dysk) i monitor może działać jako usługa i tworzyć pliki dziennika do późniejszej analizy.

Musisz dowiedzieć się, czy te korzyści warte są dodatkowych problemów z licznikami wydajności, czy też lepiej dla systemu rejestrowania.

Istnieje wiele próbek out there, które mogą ci ułatwić. Jednak nadal opłaca się zrozumieć architekturę i "oficjalną" terminologię. Zazwyczaj MS API do wymaga dużo czytania i szuka dobrego kodu opakowania, co nie oznacza, że ​​zawsze są bolesne.

+0

Skutecznie chcę napisać własną perfmonię, ale tylko dla mojej aplikacji. Musi wyświetlać własny procesor i pamięć. – Simon

+0

@Simon: Zaktualizowałem odpowiedź. – peterchen

+0

Dzięki - projekt SystemMonitor w szczególności wygląda na dobry trop. – Simon

0

ile czasu spędza w funkcji

Do tego trzeba profilera (takie jak jeden zawarte w bardziej zaawansowanych wersji programu Visual Studio). To da ci szczegółowe informacje o tym, ile razy każda metoda jest wywoływana (z lub bez funkcji, które wywołuje).

Niezbędny szczegół do identyfikacji wąskich gardeł.

CPU

Łączne liczniki proces CPU-sekund skuteczności (lub kolumny w Menedżerze zadań lub Process Explorer) pozwoli Ci to dać. W praktyce może być potrzebna większa ilość szczegółów (czas jądra w stosunku do czasu użytkownika), który również jest dostępny.

pamięć

To trudna część .... „pamięć” może oznaczać: przydzieloną wirtualną przestrzeń adresową, popełnił wirtualną przestrzeń adresową, zestaw roboczy, szczytową pracy zestawu, pamięć prywatnym ..

Prawdopodobnie musisz spędzić trochę czasu z wewnętrznymi systemami Windows lub podobnym odnośnikiem, aby zrozumieć, jak są one różne i co oznaczają przed rozpoczęciem jakiejkolwiek prawdziwej analizy.

+0

W jaki sposób chciałbym znaleźć "liczniki wydajności całego procesora CPU sekund"? – Simon

+0

@Simon: Under process in perfmon. – Richard

+0

@Richard: Chodzi mi o to, jak bym go używał z poziomu mojej aplikacji? – Simon

3

Zakładając jeden wniosek Instancji użycie procesora i pamięci (proces zestaw roboczy) można zrobić coś jak następuje:

public static void Main(string[] args) 
{ 
    string processName = Process.GetCurrentProcess().ProcessName; 
    int processorCount = Environment.ProcessorCount; 

    // Simulate process usage 
    for (int i = 0; i < processorCount * 2; i++) 
    { 
     var t = new Thread(() => 
      { 
       while (true) { Console.WriteLine("Busy..."); } 
      }); 

     t.IsBackground = true; 
     t.Start(); 
    } 

    var cpu = new PerformanceCounter("Process", "% Processor Time"); 
    cpu.InstanceName = processName; 
    cpu.NextValue(); 

    var ram = new PerformanceCounter("Process", "Working Set"); 
    ram.InstanceName = processName; 

    float memUsage = (ram.NextValue()/1024)/1024; 
    Console.WriteLine("Memory Usage: {0}MB", memUsage); 

    float cpuUsage = cpu.NextValue()/(float)processorCount; 
    Console.WriteLine("CPU Usage: {0}%", cpuUsage); 
} 

Dla perf użycie procesora przeciwdziałać pierwsze połączenie do NextValue zwraca 0, więc tylko drugie wywołanie służy do wyświetlania wartości. Zgłoszone użycie jest sumą dla wszystkich procesorów maszyn, więc średnia jest obliczana przed wyświetleniem.

2

Dla prostych informacji, rzucić okiem na te wartości z poziomu kodu C#, a następnie wybrać to, co jest najbardziej odpowiednie dla Ciebie:

 
System.Diagnostics.Process.GetCurrentProcess().TotalProcessorTime 
System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64 
System.Diagnostics.Process.GetCurrentProcess().VirtualMemorySize64 
System.GC.GetTotalMemory(false) 

PrivateMemorySize jest całkowita Bajty prywatne (zarządzany i niekontrolowana łączny) dla procesu . GetTotalMemory zapewnia całkowite wykorzystanie pamięci zarządzanej dla aplikacji, a podanie wartości true spowoduje wymuszenie GC przed uzyskaniem wartości.

+0

Wygląda dobrze - a co z procesorem? – Simon

+0

Nie wiem, czy jest cokolwiek dla bieżącego, chwilowego użycia procesora, ale TotalProcessorTime da ci czas, który wykorzystał cały proces. Jeśli to, o co prosisz, to natychmiastowy raport o wykorzystaniu procesora, musisz przyjrzeć się licznikom wydajności lub WMI. –

Powiązane problemy