Как я могу получить загрузку ЦП на ядро (четырехъядерный CPU) в C#?
Спасибо :)
Вы можете использовать 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 - общая загрузка всех процессоров
(не проверено - не рекомендую полагаться на него, пока не будет проведено дальнейшее расследование) ...
Поскольку ядра отображаются в ОС как отдельные CPU, вы используете тот же код, что и для определения нагрузки на CPU в многопроцессорной машине. Один из таких примеров (на языке C) находится здесь. Обратите внимание, что в нем используется WMI, поэтому в другом потоке, ссылка на который приведена в комментариях выше, вы, вероятно, пройдете большую часть пути.