Devo calcolare l'utilizzo della CPU e della RAM per il sistema generale e per un processo specifico. Non l'ho mai fatto in C#. Così mi è stato in grado di elaborare con il seguente codice (che ho preso soprattutto da campioni su questo sito web):I dati del contatore delle prestazioni C# sono "su tutta la mappa"
try
{
Process proc = Process.GetCurrentProcess();
string strProcName = proc.ProcessName;
Console.WriteLine("Process: " + strProcName);
using (PerformanceCounter total_cpu = new PerformanceCounter("Process", "% Processor Time", "_Total", true))
{
using (PerformanceCounter process_cpu = new PerformanceCounter("Process", "% Processor Time", strProcName, true))
{
for (; ;)
{
Console.CursorTop = 1;
Console.CursorLeft = 0;
float t = total_cpu.NextValue()/Environment.ProcessorCount;
float p = process_cpu.NextValue()/Environment.ProcessorCount;
Console.WriteLine(String.Format("Total CPU (%) = {0}\t\t\nApp CPU (%) = {1}\t\t\nApp RAM (KB) = {2}",
t, p, Process.GetCurrentProcess().WorkingSet64/(1024)
));
System.Threading.Thread.Sleep(100);
}
}
}
}
catch(Exception ex)
{
Console.WriteLine("Exception: " + ex);
}
Ma ciò che mi dà sono i dati "tutta la mappa". Date un'occhiata:
Così qualcuno può rispondere a questi punti:
Sembra correre come contatore di prestazioni è un'operazione piuttosto costosa da stesso - aumenta l'utilizzo della CPU di circa il 5%. Ho fatto un sacco di contatori di CPU con C++ e non richiedono praticamente molto tempo di esecuzione della CPU.
Oltre a ciò che ho detto sopra, la prima volta il ciclo sopra viene eseguito con un ritardo di 2 secondi ! Letteralmente si blocca per 2 secondi. È normale? Se lo è, non riesco a credere che avevano una faccia tosta di chiamare un contatore delle prestazioni :)
Anche se la mia lettura RAM è abbastanza vicino a quello riportato dal Task Manager, l'uscita della CPU è totalmente off. Qualcuno può dirmi cosa sto sbagliando qui?
Inoltre, non riesco a trovare alcuna documentazione per il PerformanceCounter class, che può spiegare tutti questi:
% Processor Time
,_Total
, ecc? E, cosa più importante, sono solo quelli inglesi? Dovrebbero essere localizzati?Il processo è specificato dal nome. Ma cosa succede se ho più di un processo con lo stesso nome in esecuzione. Cosa poi?