21xrx.com
2024-09-19 09:32:19 Thursday
登录
文章检索 我的文章 写文章
C++ 如何获取 CPU 使用率
2023-06-29 14:49:47 深夜i     --     --
C++ CPU 使用率 获取

C++是一种高效的编程语言,经常被用于开发性能要求较高的应用程序。在开发过程中,我们常常需要获取CPU的使用率来进行性能优化。本文将介绍C++如何获取CPU使用率。

获取CPU使用率的方法有很多种,这里我们介绍两种常用的方法。

第一种方法是使用操作系统提供的系统调用来获取CPU使用率。不同的操作系统提供的系统调用可能不同,这里我们以Windows系统为例。Windows提供了一个名为GetSystemTimes的API函数,该函数可以获取系统的运行时间和空闲时间。通过计算两个时间的差值,我们可以得到CPU的使用率。

下面是C++代码实现:


#include <windows.h>

double GetCPUUsage()

{

  FILETIME idleTime, kernelTime, userTime;

  if (!GetSystemTimes(&idleTime, &kernelTime, &userTime))

    return 0.0;

  static long long lastIdleTime = 0;

  static long long lastKernelTime = 0;

  static long long lastUserTime = 0;

  long long idle = (static_cast<long long>(idleTime.dwHighDateTime) << 32) | idleTime.dwLowDateTime;

  long long kernel = (static_cast<long long>(kernelTime.dwHighDateTime) << 32) | kernelTime.dwLowDateTime;

  long long user = (static_cast<long long>(userTime.dwHighDateTime) << 32) | userTime.dwLowDateTime;

  long long idleDiff = idle - lastIdleTime;

  long long kernelDiff = kernel - lastKernelTime;

  long long userDiff = user - lastUserTime;

  lastIdleTime = idle;

  lastKernelTime = kernel;

  lastUserTime = user;

  return static_cast<double>(100.0 * (1.0 - (static_cast<double>(idleDiff) / static_cast<double>(kernelDiff + userDiff))));

}

在上面的代码中,我们使用了static变量来保存每次获取的系统时间,然后计算两次系统时间的差值,从而得到CPU的使用率。最后,我们将CPU使用率以百分比的形式返回。

第二种方法是使用性能计数器来获取CPU使用率。性能计数器是一种用于性能监控的工具,可以用来监控系统各种资源的使用情况。Windows系统提供了一组性能计数器API函数,我们可以使用这些函数来监控CPU的使用率。

下面是C++代码实现:


#include <windows.h>

#include <pdh.h>

double GetCPUUsage()

{

  PDH_HQUERY query;

  PDH_HCOUNTER counter;

  PDH_FMT_COUNTERVALUE value;

  if (PdhOpenQuery(NULL, 0, &query) != ERROR_SUCCESS)

    return 0.0;

  if (PdhAddCounter(query, L"\\Processor(_Total)\\% Processor Time", 0, &counter) != ERROR_SUCCESS)

    return 0.0;

  if (PdhCollectQueryData(query) != ERROR_SUCCESS)

    return 0.0;

  Sleep(500);

  if (PdhCollectQueryData(query) != ERROR_SUCCESS)

    return 0.0;

  if (PdhGetFormattedCounterValue(counter, PDH_FMT_DOUBLE, NULL, &value) != ERROR_SUCCESS)

    return 0.0;

  PdhCloseQuery(query);

  return value.doubleValue;

}

在上面的代码中,我们使用了PDH(Performance Data Helper)API函数来获取CPU使用率。首先,我们打开了一个查询对象,然后添加了一个针对_Total处理器的性能计数器。接着,我们收集了两次计数器数据,并在两次获取计数器数据之间等待了500ms。最后,我们使用PDHGetFormattedCounterValue函数获取计数器的值,并以double类型的形式返回。

总之,无论是使用操作系统提供的系统调用还是使用性能计数器API函数,C++都可以很方便地获取CPU使用率。通过获取CPU使用率,我们可以更好地了解程序的性能瓶颈并进行性能优化,从而让程序运行更加高效。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复