繁体   English   中英

Windows中准确的系统cpu使用情况

accurate system cpu usage in windows

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在将cpu使用情况监视器添加到进程监视器中,因此我选择使用NtQuerySystemInformation,因为它是最低的API,我可以使用它来进行更准确的计算,当cpu使用率较高但cpu接近时,下面的代码可以很好地工作空闲(10:30),它不会显示任务管理器中的使用率百分比,也不会显示低于26%的使用率,但是任务管理器将其显示为15%或接近百分比

这是我的代码:

double accurate_usage() {

  SYSTEM_INFO info = { 0 };
  GetSystemInfo(&info);
  DWORD proc_num = info.dwNumberOfProcessors;
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION old_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION new_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  FILETIME old_time = { 0 }, new_time = { 0 };
  ULARGE_INTEGER uold_time = { 0 }, unew_time = { 0 };

  ULONG size;
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, old_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&old_time);
  memcpy(&uold_time, &old_time, sizeof(FILETIME));
  Sleep(1000);
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, new_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&new_time);
  memcpy(&unew_time, &new_time, sizeof(FILETIME));

  double percent = 0.0;
  for (DWORD i = 0; i < proc_num; ++i) {
      double current_percent = (new_values[i].KernelTime.QuadPart - old_values[i].KernelTime.QuadPart) +
      (new_values[i].UserTime.QuadPart - old_values[i].UserTime.QuadPart) - 
      (new_values[i].IdleTime.QuadPart - old_values[i].IdleTime.QuadPart);
      current_percent /= (unew_time.QuadPart - uold_time.QuadPart);
      current_percent /= proc_num;
      current_percent *= 100;
      percent += current_percent;
  }
  return percent;
}
1 个回复

工作代码:

double accurate_usage() {

  SYSTEM_INFO info = { 0 };
  GetSystemInfo(&info);
  DWORD proc_num = info.dwNumberOfProcessors;
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION old_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION new_values = new SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION[proc_num];
  FILETIME old_time = { 0 }, new_time = { 0 };
  ULARGE_INTEGER uold_time = { 0 }, unew_time = { 0 };

  ULONG size;
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, old_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&old_time);
  memcpy(&uold_time, &old_time, sizeof(FILETIME));
  Sleep(1000);
  fNtQuerySystemInformation(SystemProcessorPerformanceInformation, new_values, sizeof(old_values[0]) * proc_num, &size);
  GetSystemTimeAsFileTime(&new_time);
  memcpy(&unew_time, &new_time, sizeof(FILETIME));

  double percent = 0.0;
  for (DWORD i = 0; i < proc_num; ++i) {
      double current_percent = (new_values[i].IdleTime.QuadPart - old_values[i].IdleTime.QuadPart) * 100 ;
      current_percent /= ((new_values[i].KernelTime.QuadPart + new_values[i].UserTime.QuadPart) - (old_values[i].KernelTime.QuadPart + old_values[i].UserTime.QuadPart));
      current_percent = 100 - current_percent;
      percent += current_percent;
  }
  return percent / 10;
}
1 C ++在Windows上获得准确的CPU使用率

如何获得CPU使用率? 我从Google找到了一些代码,但是它们不是很准确,也许我用错了方式。 这是我的代码: 样本输出: cpu: 0.0 cpu: 14.2 cpu: 0.0 cpu: 14.2 cpu: 0.0 cpu: 13.9 cpu: 0.0 cpu: 13.9 ...

3 在Windows上获取系统范围的CPU使用率[Java]

根据该线程 ,JVM可以使用以下代码来获取CPU使用率: 但是,要获得整个计算机的CPU使用率,必须将"ProcessCpuLoad"替换为"SystemCpuLoad" 。 但是,当我在Windows Server上执行此代码时,它总是返回NaN即使我按照另一个线程的一个注释中的建议 ...

5 与任务管理器相比,CPU 使用率不准确

我试图以百分比形式获得与任务管理器相同的 CPU 使用率结果。 对于内存,我使用了这段代码,看起来工作正常: 所以我用同样的想法尝试了 CPU。 我知道这个问题被问过多次,但我没有找到一个正确的解决方案。 我正在使用以下代码(我也尝试过 _Total): 问题:这段代码有什么问题,如何更正 ...

6 HTA通过WMI监视CPU使用率百分比-不准确

我一直在尝试获取我正在创建的简单桌面应用程序的CPU使用率百分比。 我已经将几个VBS脚本放到了似乎有效的HTA中,但是它不是很准确,或者至少我不认为与任务管理器同时运行- 我正在使用Win32_PerfRawData_PerfOS_Processor中的“总计” 您能否看一下 ...

8 准确计算 Linux 中以百分比给出的 CPU 使用率?

这是一个被问过很多次的问题,但是我找不到得到很好支持的答案。 很多人建议使用 top 命令,但是如果您运行 top 一次(因为您有一个脚本,例如每 1 秒收集一次 Cpu 使用率),它总是会给出相同的 Cpu 使用率结果( 示例 1 , 示例 2 )。 计算 CPU 使用率的一种更准确的方法是读 ...

9 C#系统CPU使用率并与Windows任务管理器同步

这是一个两部分问题,我想在堆栈上发布我的代码,以帮助其他人完成相同的任务。 问题1: 我有一个代码子集,我相信,根据测量间隔正确地测量CPU使用率(在系统中,根据检索的次数) - 我在线程调用中使用1秒。 我不得不从Web上的极少篇文章和C ++代码中解读这个。 我的问题是, ...

10 了解Windows上Web服务器上的高系统CPU使用率[关闭]

注意我们对这篇文章有几个接近的投票。 我不确定为什么,因为没有人评论,但这个问题是关于我们的自定义编写的Java服务器及其对套接字读取的调用如何与Windows操作系统交互并产生这种高系统CPU使用率,因此我相信这是正确的论坛发布此问题而不是系统管理员区域。 我有一个自定义Java服务器 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM