[C++]-Windows下获取CPU、内存利用率

CPU利用率

内存利用率

 

在《Windows下使用PDH获取性能计数器(CPU、内存、网络流量等)》中介绍了通过性能计数器获取计算机性能信息,若只是获取CPU利用率及内存利用率,可以直接通过API获取。Windows提供了相关函数来获取:

  • GetSystemTimes:获取CPU的空闲、内核、用户使用时间;

  • GetProcessTimes:获取进程的内核、用户使用时间,以及创建、退出时间等;

  • GlobalMemoryStatusEx:获取内存相关的详细信息;

CPU利用率

GetProcessTimes返回的使用时间是FILETIME格式的,获取CPU利用率只需获得一段时间内空闲时间与使用时间即可方便计算得到。为了得到当前CPU利用率,需要调用两次(间隔一段时间,如1s),然后计算其差值。

其中kernelTime中包含idleTime,所以需要减去后才能得到实际的内核使用时间。

__int64 Filetime2Int64(const FILETIME &ftime)
{
    LARGE_INTEGER li;
    li.LowPart = ftime.dwLowDateTime;
    li.HighPart = ftime.dwHighDateTime;
    return li.QuadPart;
}

__int64 CompareFileTime2(const FILETIME &preTime, const FILETIME &nowTime)
{
    return Filetime2Int64(nowTime) - Filetime2Int64(preTime);
}

double getCpuUsage()
{
    FILETIME preIdleTime;
    FILETIME preKernelTime;
    FILETIME preUserTime;
    GetSystemTimes(&preIdleTime, &preKernelTime, &preUserTime);

    Sleep(1000);

    FILETIME idleTime;
    FILETIME kernelTime;
    FILETIME userTime;
    GetSystemTimes(&idleTime, &kernelTime, &userTime);

    auto idle = CompareFileTime2(preIdleTime, idleTime);
    auto kernel = CompareFileTime2(preKernelTime, kernelTime);
    auto user = CompareFileTime2(preUserTime, userTime);

    if (kernel + user == 0)
        return 0;

    return 1.0*(kernel + user - idle) / (kernel + user);
}

内存利用率

通过GlobalMemoryStatusEx获取内心相关详细信息,信息的详细结构:

typedef struct _MEMORYSTATUSEX {
  DWORD     dwLength;
  DWORD     dwMemoryLoad;
  DWORDLONG ullTotalPhys;
  DWORDLONG ullAvailPhys;
  DWORDLONG ullTotalPageFile;
  DWORDLONG ullAvailPageFile;
  DWORDLONG ullTotalVirtual;
  DWORDLONG ullAvailVirtual;
  DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

其中dwMemoryLoad即为内存利用率。

const int Byte2MB = 1024 * 1024;
void getMemoryRate() {
    MEMORYSTATUSEX memStatus;
    memStatus.dwLength = sizeof(memStatus);
    GlobalMemoryStatusEx(&memStatus);
    int nAvail = (int)(memStatus.ullAvailPhys / Byte2MB);
    int nTotal = (int)(memStatus.ullTotalPhys / Byte2MB);
    cout << "Memory: " << memStatus.dwMemoryLoad << "%, " << nAvail << "/" << nTotal << endl;
}

 

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值