Подтвердить что ты не робот

В программе С# я пытаюсь получить процент использования процессора от приложения, но он всегда показывает 100

Вот мой код.

        PerformanceCounter cpuCounter = new PerformanceCounter();
        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";

        // will always start at 0
        dynamic firstValue = cpuCounter.NextValue();
        System.Threading.Thread.Sleep(1000);


        dynamic secondValue = cpuCounter.NextValue();
        return secondValue;

Здесь много людей, которые сталкиваются с проблемой, что это возвращает ноль, но я все равно получаю 100, и я точно знаю, что мое программное обеспечение не занимает столько мощного процессора. Любые идеи относительно того, что я могу сделать, чтобы сделать эту работу правильно. Чтобы быть ясным, я пытаюсь извлечь использование процессора из приложения, использующего этот код, а не отдельный. Также я работаю на виртуальной машине, но это, похоже, не имеет значения. Любые идеи?

4b9b3361

Ответ 1

Это помогает понять, как работает процессор, чтобы понять, почему это происходит. Я немного упрощу это, говоря о процессоре с одним ядром, история не меняется для одного с несколькими ядрами.

Ядро cpu может находиться только в двух разных состояниях, когда оно не находится в спящем режиме. Он либо выполняет код, работая на полном уровне так быстро, как может выполнять исполняемые инструкции. Или он не выполняет код, потому что ничего не нужно делать. В этом случае он физически отключается. Это происходит, когда он выполняет инструкцию HLT. Остановитесь, ничего не делайте, не потребляйте силы.

Существует только один способ оживить процессор из состояния Halt, требуется прерывание. Это физический контакт на чипе, электрическое напряжение на этом штыре оживляет его. Это напряжение генерируется контроллером прерываний, другой чип, который принимает запросы от различных частей машины, чтобы заставить процессор сделать что-то полезное.

Самый важный источник этого прерывания - это часы. Он гаснет в 0,0156 секунды, тряся процессор назад 64 раза в секунду. Что активирует кусок кода в операционной системе, который в основном проверяет две вещи. "Что-то случилось, когда я спал?". И "Я совсем не спал, время, чтобы сделать что-то еще важное". Или, другими словами, это не просто толчок процессора, он также прерывает его в том, что он делает. Таким образом, имя сигнала.

Часы не являются единственным источником прерываний, у вас есть другие бит оборудования, подключенные к процессору. Устройства ввода/вывода. Важными для любой машины являются контроллер диска, контроллер оптического привода, сетевая карта, мышь и клавиатура. И все, что вы видите в апплете диспетчера устройств. Это подсистемы со своими небольшими процессорами, которые могут заботиться о вещах. И скажите основному процессору, что они сделаны. Таким образом, любой поток на вашем компьютере ожидал результата, может возобновить выполнение с предоставленными данными.

Подавляющее большинство времени, что персональный компьютер, который вы сидите рядом с вами, не делает ничего важного. Это, скажем, ждет, когда вы прочтете этот ответ. Что-то, о чем заботятся видеоадаптер и ЖК-монитор, процессор не должен помогать. Вы можете увидеть его в TaskMgr.exe, загрузка процессора колеблется вокруг 0. Вы перемещаете мышь, нажимаете на полосу прокрутки, чтобы прочитать этот (длинный) ответ, затем что-то происходит. Мышь генерирует прерывание, которое проходит через несколько слоев программного обеспечения, и в конечном итоге он указывает браузеру прокручивать представление. Это занимает около нескольких миллисекунд, дайте или возьмите.

Несколько миллисекунд работы, процессор возвращается за спиной сразу после него. Поэтому, когда вы спрашиваете процессор, с помощью счетчика производительности, "сколько работы вы сделали в последнее время", он скажет: "Хорошо, я потратил пару миллисекунд, сжигая ядро ​​и работая над своим обновлением экрана, но нет, другой чем то, что я спал на горошине"

Так важно то, как часто вы спрашиваете. Шаблонный путь - это тот, который использует Перфмон. Через секунду он спрашивает "что вы сделали". И процессор скажет: "Ну, в последнюю секунду я выполнил 20 миллисекунд полезной работы. Я был мертв в мире, остальное время, ничего полезного делать". Таким образом, диспетчер задач отображает 2%.

Теперь давайте сделаем это по-своему. Вы запрашиваете значение первичного счетчика, а затем через наносекунду позже вы просите его снова. Процессор скажет: "ну, я вернул значение счетчика производительности и попытался вернуться спать. Не работал, программа продолжала работать и спрашивала меня то же самое!".

Итак, результат точный, процессор занят вашими запросами, вы не дали ему возможности отключиться. Использование КПД было 100%.

Решение: сделайте это, как Perfmon. Спросите один раз с секундомером. Сделайте его короче, и число будет увеличиваться и уменьшаться быстрее. Сделайте его слишком коротким, и он будет на 100%

Ответ 2

вот что-то, что было сделано аналогично тому, что вы пытаетесь сделать

PerformanceCounter cpuCounter;
PerformanceCounter ramCounter;

cpuCounter = new PerformanceCounter();

cpuCounter.CategoryName = "Processor";
cpuCounter.CounterName = "% Processor Time";
cpuCounter.InstanceName = "_Total";

ramCounter = new PerformanceCounter("Memory", "Available MBytes");


public string getCurrentCpuUsage(){
            return cpuCounter.NextValue()+"%";
}

public string getAvailableRAM(){
            return ramCounter.NextValue()+"MB";
}