如何使用PerformanceCounter类计算%CPU利用率?

时间:2014-07-31 18:12:58

标签: c# .net performancecounter

我一直在关注PerformanceCounter Class来监控系统性能。我已经想出如何调用内置计数器。我正在努力的是理解我得到的价值观以及如何将这些价值与我在任务管理器中看到的价值进行比较。

到目前为止,我已成功监控MB中的可用内存,并且它正确对应于任务管理器中的值。

首先我创建了PerformanceCounter

 myMemoryCounter = new PerformanceCounter("Memory", "Available MBytes", true);

然后我将以下行放在循环中。

Console.WriteLine("Value" + myMemoryCounter.NextSample().RawValue.ToString());

在查看处理器的计数器时,我无法连接到可在任务管理器中观察到的%CPU利用率。

我是否需要拥有多个计数器并计算值?还是有更简单的方法?

更新

查看问题What is the correct Performance Counter to get CPU and Memory Usage of a Process?它只描述了要使用的计数器,而不是如何将结果转换为百分比?

NextSample().RawValue返回长数据类型,我需要知道如何将其转换为百分比。

使用以下代码

 var _myCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
 Console.WriteLine("CPU " + _myCPUCounter.NextSample().RawValue.ToString("0.000"));

我得到这个值1794607539062如何将其转换为百分比?

2 个答案:

答案 0 :(得分:1)

// TRY THIS
public class MyCPU
{
    // This method that will be called when the thread is started
    public void Info()
    {
        /*
         * CPU time (or process time) is the amount of time for which a central processing unit (CPU) was used for processing instructions of a computer program or operating system
         */
        PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
        for (int i64 = 0; i64 < 100; ++i64)
        {
            Console.WriteLine("CPU: " + (cpuCounter.NextValue() / Environment.ProcessorCount) + " %");
        }
    }
};

答案 1 :(得分:0)

根据来源,对于类型为Timer100NsInverse的CPU计数器,计算器方法返回:

(1f - ((float)(newSample.RawValue - oldSample.RawValue))/(float)(newSample.TimeStamp - oldSample.TimeStamp)) * 100.0f;

请注意,它需要两个样本。

查看您可以在网络上的多个位置找到的CounterSampleCalculator.cs。它可以显示所有类型的所有计算。但您可以调用Calculate方法,或者如前所述NextValue()