在没有TaskMgr的情况下测量/测量CPU使用率?

时间:2010-11-05 19:32:11

标签: windows windows-7 cpu-usage taskmanager

我正在尝试在长时间运行的过程中衡量CPU利用率水平。我怀疑每次运行任务管理器来查看数据时,进程的CPU利用率都会下降,因为taskmanager具有更高的优先级。如果我给我的进程实时优先级,那么任务管理器完全锁定,我不能使用它。我希望我的大部分CPU周期专用于此过程,我想大致了解它的使用量。我不需要一个二秒钟的监视器,但只需要一些快照让我知道发生了什么。我怎么能做到这一点?

5 个答案:

答案 0 :(得分:1)

可能是procdump - 但sysinternals process tools中的一个应该帮助

答案 1 :(得分:1)

使用C API以编程方式,您可以使用Performance Counter API。 (CPU使用率只是另一个计数器)。您可以使用low-level registry API to query the performance counter获取数据。或者您可以使用PDH API(Performance Data Helper API) - 这可能就是您想要的。我过去使用过这两种颜色,PDH api很容易使用。

另一个帮助您枚举可用计数器名称的工具是perfmon。 (只需运行c:\ windows \ system32 \ perfmon.exe)。它也是任务管理器的有用替代品。它还可以记录和绘图。您可以在多进程机器上为每个逻辑处理器设置计数器。

答案 2 :(得分:0)

我不确定您对任务管理器的关注是否有效。任务管理器足够轻量级,它不会淹没你长时间运行的进程,并且可以窃取足够的CPU周期。如果您的进程确实是CPU饥饿,您将在任务管理器中看到它。如果你没有看到你的进程所期望的CPU使用量那么多,你的假设是你的进程需要一段时间,因为它使用了大量的CPU是错误的。也许你的长时间运行过程是长期运行的,因为它的IO绑定或等待事件或睡眠很多。即做其他事情而不是使用CPU。如果它使用了大量的CPU而不是100%,或许它的效率可能不如我上面列出的原因那么高。

答案 3 :(得分:0)

您可以编写一个简单的工具,通过GetProcessTimes

查询特定流程(例如,通过id)

行中的内容:

main()
  HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id);
  for(;;) { 
    GetProcessTimes(h, /*..times.. */);
    printf("time taken %d\n", (kerneltime+usertime));
    Sleep(1000);
  }

答案 4 :(得分:0)

@martin Becket:procmon允许您在特定进程的属性中查看详细的cpu使用情况