我试图衡量长时间运行过程中的CPU利用率水平。 我怀疑每次运行task-manager查看数据时,进程的CPU利用率都会下降,因为taskmanager具有更高的优先级。 如果我给予我的进程实时优先级,那么任务pipe理器完全locking,我不能使用它。 我希望我的大部分CPU周期都用在这个过程中,我想大致了解它的使用情况。 我不需要一秒钟的显示器,只是几张快照让我知道发生了什么。 我怎样才能做到这一点?
用C API编程,可以使用性能计数器API。 (CPU使用率只是另一个计数器)。 您可以使用低级注册表API来查询数据的性能计数器 。 或者你可以使用PDH API (性能数据助手API) – 这可能是你想要的。 我已经在过去和PDH api都很容易使用。
另一个帮助你枚举可用计数器名字的工具是perfmon。 (只需运行c:\ windows \ system32 \ perfmon.exe)。 它也是任务管理器的一个有用的选择。 它也做记录和图表。 您可以为多处理器上的每个逻辑处理器设置计数器。
可能procdump – 但sysinternals过程工具之一应该帮助
我不确定你对任务管理器的关注是否有效。 任务管理器足够轻便,不会淹没长时间运行的进程,窃取足够多的CPU周期。 如果你的进程确实是那个CPU饿了,你会在任务管理器中看到它。 如果你没有看到你所期望的CPU使用率,那么你的过程需要一段时间,因为它使用了大量的CPU是错误的。 也许你的长时间运行的过程是长时间运行,因为它的IO绑定或等待事件或睡眠很多。 即做其他事情比使用CPU。 如果它使用了大量的CPU,但不是100%,或许它的效率不如我上面列出的相同的原因。
你可以写一个简单的工具,通过GetProcessTimes查询特定的进程(比如id)
有些事情
main() HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, id); for(;;) { GetProcessTimes(h, /*..times.. */); printf("time taken %d\n", (kerneltime+usertime)); Sleep(1000); }
@martin Becket:procmon可以让你在一个特定的进程的属性中看到详细的CPU使用情况