我需要计算整个系统以及特定进程的 CPU 和 RAM 使用率。我从来没有在 C# 中这样做过。所以我能够想出以下代码(我主要从这个网站上的示例中获取):
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);
}
但它给我的是“遍布地图”的数据。看一看:
所以有人可以回答这些问题:
似乎运行这样的性能计数器本身就是一项非常昂贵的操作——它将 CPU 使用率提高了大约 5%。我用 C++ 做了很多 CPU 计数器,它们几乎不需要 CPU 时间来运行。
除了我上面所说的之外,上面的循环第一次运行时有2 秒的延迟!它实际上挂断了 2 秒。正常吗?如果是的话,我不敢相信他们居然敢称它为性能计数器:)
尽管我的 RAM 读数与任务管理器报告的非常接近,但 CPU 输出完全关闭。有人可以告诉我我在这里做错了什么吗?
此外,我似乎找不到PerformanceCounter 类的任何文档,可以解释所有这些:
% Processor Time
、_Total
等等?最重要的是,那些只有英文吗?他们应该本地化吗?那里的进程由其名称指定。但是,如果我有多个同名进程正在运行,该怎么办。然后怎样呢?