2011-01-13 11 views
51

Come posso ottenere CPU e Utilizzo memoria di un particolare processo utilizzando la classe .NET PerformanceCounter? E anche qual è la differenza traQual è il contatore delle prestazioni corretto per ottenere l'utilizzo della CPU e della memoria di un processo?

Processor\% Processor Time e Process\% Processor Time?

Sono un po 'confuso tra questi due.

+3

Non esiste un modo corretto per misurare l'utilizzo della memoria. La memoria può essere utilizzata in molti modi diversi. Ad esempio, contate la memoria scambiata su disco o memoria che è solo riservata/impegnata ma non ancora scritta, ... – CodesInChaos

risposta

91

Da this postale:

Per ottenere l'intero PC CPU e della memoria:

using System.Diagnostics; 

quindi dichiarare a livello globale:

private PerformanceCounter theCPUCounter = 
    new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

Quindi per ottenere il tempo di CPU, semplicemente chiamare il metodo NextValue():

this.theCPUCounter.NextValue(); 

questo modo si ottiene l'utilizzo della CPU

Per quanto riguarda l'utilizzo della memoria, la stessa cosa vale Credo:

private PerformanceCounter theMemCounter = 
    new PerformanceCounter("Memory", "Available MBytes"); 

Quindi per ottenere l'utilizzo della memoria, è sufficiente chiamare il metodo NextValue():

Per un processo specifico CPU e utilizzo della memoria:

private PerformanceCounter theCPUCounter = 
    new PerformanceCounter("Process", "% Processor Time",    
    Process.GetCurrentProcess().ProcessName); 

dove Process.GetCurrentProcess().ProcessName è il nome del processo che si desidera ottenere le informazioni su.

private PerformanceCounter theMemCounter = 
    new PerformanceCounter("Process", "Working Set", 
    Process.GetCurrentProcess().ProcessName); 

dove Process.GetCurrentProcess().ProcessName è il nome del processo che si desidera ottenere le informazioni circa.

Nota che working set può non essere sufficiente a se stante per determinare l'impronta memoria del processo - vedere What is private bytes, virtual bytes, working set?

Per recuperare tutte le categorie, vedi Walkthrough: Retrieving Categories and Counters

La differenza tra Processor\% Processor Time e Process\% Processor Time è Processor è dal PC stesso e Process è per singolo processo. Quindi il tempo del processore del processore sarebbe l'utilizzo sul PC. Il tempo del processore di un processo sarebbe l'utilizzo dei processi specificato. Per la descrizione completa dei nomi di categoria: Performance Monitor Counters

Un'alternativa all'utilizzo il contatore delle prestazioni

Usa System.Diagnostics.Process.TotalProcessorTime e System.Diagnostics.ProcessThread.TotalProcessorTime oggetti da calcolare il vostro utilizzo del processore in quanto questo article descrive.

+1

Ma fornirà l'utilizzo CPU/memoria del processo corrente da cui viene chiamata la funzione? –

+0

L'utilizzo della memoria non è la memoria disponibile. Come posso utilizzare i megabyte, non disponibile? –

+1

Se creo il CPUCounter come sopra, viene visualizzato InvalidOPerationException: "Impossibile caricare i dati del nome del contatore perché un indice non valido" è stato letto dal registro. " – Ted

3

Capelli Hyper-V:

private PerformanceCounter theMemCounter = new PerformanceCounter(
    "Hyper-v Dynamic Memory VM", 
    "Physical Memory", 
    Process.GetCurrentProcess().ProcessName);