2010-11-05 85 views
1

我试图衡量长时间运行过程中的CPU利用率水平。我怀疑每次运行task-manager查看数据时,由于taskmanager具有更高的优先级,因此进程的CPU利用率下降。如果我给予我的进程实时优先级,那么任务管理器完全锁定,我无法使用它。我希望我的大部分CPU周期专用于此过程,并且我想大致了解它的使用量。我不需要一秒钟的显示器,只需要几张快照让我知道发生了什么。我怎样才能做到这一点?衡量/测量没有TaskMgr的CPU使用率?

+1

做的特性*不*设置你的进程,以实时,如果你想别的运行(如您的鼠标光标)。 – Gabe 2010-11-06 21:06:07

回答

1

编程方式使用C API,你可以使用性能计数器API。 (CPU使用率只是另一个计数器)。您可以使用low-level registry API to query the performance counter作为数据。或者你可以使用PDH API(性能数据助手API) - 这可能是你想要的。我已经在过去使用过,PDH api很容易使用。

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

+0

C API无法访问,但对perfmon有很好的建议!我总是忘记使用该工具。本文有帮助:http://adminfoo.net/2007/04/windows-perfmon-top-ten-counters.html – SFun28 2010-11-08 17:31:03

0

我不知道你对任务管理器的关注是有效的。任务管理器足够轻便,不会淹没长时间运行的进程并窃取足够的CPU周期。如果你的过程真的是那个CPU饿了,你会在任务管理器中看到它。如果你没有看到你所期望的CPU使用率太高,那么你的假设是你的过程需要一段时间,因为它使用了大量的CPU是错误的。也许你的长时间运行过程是长时间运行的,因为它的IO限制或等待事件或睡眠很多。即做其他事情比使用CPU。如果它使用大量CPU但不是100%,或许它的效率不如我上面列出的相同原因。

+0

当我的进程设置为实时时,什么能解释taskmgr冻结,但当优先级设置为高时工作正常吗?我的过程主要是CPU限制的(实际上我只是自动化Excel,Excel是这里所讨论的真正的过程 - 它的处理计算繁重) – SFun28 2010-11-08 17:24:30

+0

没有设计成实时运行的过程将冻结其余的系统如果他们不屈服时间。即它们需要被设计成实时优先运行。具有实时优先级的冻结行为可能会发生在没有为其设计的任何应用程序上。 – bot403 2010-11-08 17:55:21

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); 
    } 
+0

我敢肯定,在.net中可能有这样做的方法。我在十年内没有碰过C++。寻找一个开箱即用的工具。将尝试这个职位上的其他建议像perfmon和sysinternals的东西。 – SFun28 2010-11-08 17:26:16

0

@马丁贝克特:procmon中,您可以看到详细的CPU使用率在特定的工艺