Проблема в том, что, хотя вы намеревались выполнить «недавнее» вычисление использования, у вас есть случайная строка кода, сбрасывающая его к кумулятивному (с момента запуска) вычислению использования.
Меры вычисления getSystemCpuLoadBetweenTicks(oldTicks)
истекший пользователь, система, бездействие и т. д. c. тики от текущих счетчиков до предыдущих, которые вы передали ему, и даст вам возможность использовать эти временные интервалы. В вашем методе cpuData()
вы правильно сохраняете старые галочки и, вероятно, намереваетесь использовать их снова. Эта часть верна.
Однако в вашем processProcessorInformation()
вы каждый раз обнуляете массив oldTicks
: oldTicks = new long[TickType.values().length];
. Таким образом, возвращаемое значение представляет собой совокупное среднее использование ЦП с момента запуска, а не последние 10 секунд. Удаление этой строки (или перемещение за пределы запланированного метода) должно дать ожидаемые результаты.
Вам также не требуется каждый раз иметь бесплатную sh копию объекта cpu
. Вы можете переместить эту инициализацию из запланированного метода во время перемещения инициализации * 1013. *
В соответствующей заметке @ Elliot-Frisch упоминается в комментариях о вычислениях с использованием нескольких процессоров. Это полезное предупреждение при сравнении тиков процессора со временем (например, если вы измеряете тики между прошедшими периодами времени). Тики накапливаются на каждом логическом процессоре, поэтому вам необходимо убедиться, что вы масштабируете «истекшее время», чтобы включить также каждый логический процессор. Это применимо при работе с вычислениями ЦП для каждого процесса, поскольку у вас есть только время выполнения процесса в качестве знаменателя, и в этом случае Windows Диспетчер задач масштабируется, чтобы гарантировать, что ни один процесс не превысит 100%, а результаты * nix (на * 1016) *) не масштабируются и могут превышать 100%.
Однако для использования системного процессора у нас имеется счетчик тиков "бездействия", который накапливает тики на всех процессорах и является лучшим выбором для вычисление процента использования - и это то, что используется в методе getSystemCpuLoadBetweenTicks()
, поэтому это исправление не требуется.