如何在C#中获得每个核心的CPU负载?

时间:2010-05-30 12:35:30

标签: c# load cpu core

如何在C#中获得每核心CPU负载(quadcore cpu)?

谢谢:)

3 个答案:

答案 0 :(得分:7)

您可以使用WMI或System.Diagnostics名称空间。从那里你可以获取你想要的任何性能计数器(但是需要一秒钟(1-1.5秒)来初始化它们 - 读取值是正常的,只有初始化很慢)

代码看起来像这样:

    using System.Diagnostics;

    public static Double Calculate(CounterSample oldSample, CounterSample newSample)
    {
        double difference = newSample.RawValue - oldSample.RawValue;
        double timeInterval = newSample.TimeStamp100nSec - oldSample.TimeStamp100nSec;
        if (timeInterval != 0) return 100*(1 - (difference/timeInterval));
        return 0;
    }

    static void Main()
    {
        var pc = new PerformanceCounter("Processor Information", "% Processor Time");
        var cat = new PerformanceCounterCategory("Processor Information");
        var instances = cat.GetInstanceNames();
        var cs = new Dictionary<string, CounterSample>();

        foreach (var s in instances)
        { 
            pc.InstanceName = s;
            cs.Add(s, pc.NextSample());
        }

        while (true)
        {
            foreach (var s in instances)
            {
                pc.InstanceName = s;
                Console.WriteLine("{0} - {1:f}", s, Calculate(cs[s], pc.NextSample()));
                cs[s] = pc.NextSample();
            }
            System.Threading.Thread.Sleep(500);
        }
    }

重要的是你不能依赖100ns逆向性能计数器的原生.net计算(对我来说只返回0或100 ...... bug?)但你必须自己计算它,为此你需要一个最后CounterSamples的存档对于每个实例(实例代表核心或这些核心的总和)。

这些实例似乎有一个命名对话:

0,0 - 第一个cpu第一核心 0,1 - 第一个cpu第二个核心 0,_ Total - 第一个cpu的总负载 _Total - 所有cpus的总负载

(未经核实 - 不建议依赖它,直到进一步调查完毕)......

答案 1 :(得分:0)

由于核心显示为与操作系统分离的CPU,因此您使用相同的代码来确定多处理器计算机中每个CPU的负载。一个这样的例子(在C中)是here。请注意,它使用WMI,因此上面评论中链接的其他线程可能会让您大部分都在那里。

答案 2 :(得分:0)

首先,您需要与内核一样多的性能计数器(这需要时间,您可能需要在异步任务中执行此操作,或者它会阻塞UI):

CoreCount= Environment.ProcessorCount;
CPUCounters = new PerformanceCounter[CoreCount];
for (var i = 0; i < CoreCount; i++)
    CPUCounters[i] = new PerformanceCounter("Processor", "% Processor Time", $"{i}");

然后,您可以获取每个内核的使用价值:

public float[] CoreUsage { get; set; } // feel free to implement inpc

public void Update() => CoreUsage = CPUCounters.Select(o => o.NextValue()).ToArray();

不过,您可能想打三次电话Update():第一次总是收到0.0,然后第二次总是0.0100.0,然后在最后一个实际值。

NextValue()为您提供即时值,而不是随时间的平均值;如果您希望平均值在1秒钟内说完,则可以使用RawValue并按照以下说明计算平均值:PerformanceCounter.RawValue Property