【发布时间】:2021-08-11 08:51:25
【问题描述】:
我正在尝试获取 CPU 负载,并希望尽可能接近任务管理器中显示的结果。
我第一次尝试使用 WMI,它返回了一个很好的结果,但速度非常慢(1-10 秒才能完成。
我现在正在尝试基于代码here使用GetSystemTimes
代码如下:
static class ProcessorLogic {
// calc cpu
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetSystemTimes(out FILETIME lpIdleTime, out FILETIME lpKernelTime, out FILETIME lpUserTime);
static bool bUsedOnce = false;
static ulong uOldIdle = 0;
static ulong uOldKrnl = 0;
static ulong uOldUsr = 0;
public static int CPUusagePercent() {
int nRes = -1;
if (GetSystemTimes(out FILETIME ftIdle, out FILETIME ftKrnl, out FILETIME ftUsr)) {
ulong uIdle = ((ulong)ftIdle.dwHighDateTime << 32) | (uint)ftIdle.dwLowDateTime;
ulong uKrnl = ((ulong)ftKrnl.dwHighDateTime << 32) | (uint)ftKrnl.dwLowDateTime;
ulong uUsr = ((ulong)ftUsr.dwHighDateTime << 32) | (uint)ftUsr.dwLowDateTime;
if (bUsedOnce) {
ulong uDiffIdle = uIdle - uOldIdle;
ulong uDiffKrnl = uKrnl - uOldKrnl;
ulong uDiffUsr = uUsr - uOldUsr;
if ((uDiffKrnl + uDiffUsr) != 0) { //Calculate percentage
nRes = (int)((uDiffKrnl + uDiffUsr - uDiffIdle) * 100 / (uDiffKrnl + uDiffUsr));
}
}
bUsedOnce = true;
uOldIdle = uIdle;
uOldKrnl = uKrnl;
uOldUsr = uUsr;
}
return nRes;
}
}
我得到的结果大约是任务管理器上显示的结果的 40%(在 Intel(R) Core(TM) i7-10850H 2.70GHz 6 核上运行)
-
我做错了什么?
-
我觉得我在这里重新发明轮子,是否有可靠的库/项目/代码来正确获得这些结果?
【问题讨论】:
-
performancecounter 比 getsystimes 好吗?
-
我不知道 getsystimes。 Windows PerformandeCounter works well 在 Windows 上对我来说很流畅,即使我并不真正理解它适用于多个进程实例的 hack。而且它不需要使用 DllImport 调用 WinAPi。
标签: c#