Как я могу получить нагрузку на процессор на ядро ​​в C #? - PullRequest
5 голосов
/ 30 мая 2010

Как я могу получить нагрузку на процессор на ядро ​​(четырехъядерный процессор) в C #?

Спасибо:)

Ответы [ 2 ]

7 голосов
/ 30 мая 2010

Вы можете использовать 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);
        }
    }

Важно то, что вы не можете полагаться на собственные вычисления .net для счетчиков производительности 100nsInverse (возвращает только 0 или 100 для меня ... ошибка?), Но вы должны рассчитать их самостоятельно, и для этого вам нужен архив последних CounterSamples для каждого экземпляра (экземпляры представляют ядро ​​или сумму этих ядер).

Похоже, существует соглашение об именах для этих случаев:

0,0 - первый процессор первого ядра 0,1 - первый процессор второго ядра 0, _Total - общая загрузка первого процессора _Total - общая загрузка всех процессоров

(не проверено - не рекомендую полагаться на него, пока не будет проведено дальнейшее расследование) ...

0 голосов
/ 30 мая 2010

Поскольку ядра отображаются как отдельные процессоры для ОС, вы используете тот же код, который вы использовали бы для определения нагрузки на процессор в многопроцессорной машине. Одним из таких примеров (в C) является здесь . Обратите внимание, что он использует WMI, так что другой поток, связанный в комментариях выше, вероятно, поможет вам в этом.

...