1

有时代码可以利用设备驱动程序,直到系统无响应。

最近我优化了一个 WIN32/VC++ 代码,它使系统几乎没有响应。但是,CPU 使用率非常低。原因是 GDI 对象(钢笔、画笔等)的创建和销毁数以千计。一旦我重构代码以仅创建一次所有对象 - 系统再次变得响应。

这让我想到了一个问题:有没有办法测量给定程序/函数/代码行的设备驱动程序(GPU/磁盘/等)的 CPU/IO 使用率?

4

3 回答 3

3

您可以使用 SysInternals Utilities 中的各种工具(现在是 Microsoft 产品,请参阅http://technet.microsoft.com/en-us/sysinternals/bb545027)在开始之前给出一个基本概念。在您的案例中,流程资源管理器 (procexp)和进程监视器(procmon)执行体面的工作。它们可用于让您在进行剖析钻取之前对缓慢的类型有一个基本的了解。

然后您可以使用 xperf http://msdn.microsoft.com/en-us/performance/default进行深入研究。通过正确的设置,该工具可以带您使用导致缓慢的确切功能,而无需将分析代码注入现有程序。已经有一个关于如何使用它的 PDC 视频http://www.microsoftpdc.com/2009/CL16我强烈推荐这个工具。根据我自己的经验,最好先使用 procexp/procmon 进行观察,然后再使用 xperf 定位您的嫌疑人,因为如果不以智能方式过滤,xperf 会产生大量信息。

在某些涉及锁定争用的困难情况下,Windows 调试工具 (windbg) 将非常方便,并且有专门的书籍讨论它的用法。这些书通常讨论挂起检测,这里也有很多技术可以用来检测慢速。(例如!失控)

于 2011-01-07T06:46:47.453 回答
2

也许您可以为此使用ETW ?不太确定它是否会帮助您了解是哪条线路导致了什么,但它应该可以让您全面了解您的应用程序的运行情况。

于 2011-01-06T21:51:06.213 回答
0

实时查看程序的CPU/内存/磁盘使用情况,可以使用windows自带的资源监视器和任务管理器程序。您可以通过打印出 systime 来找到一个代码块相对于其他代码块所花费的时间。记住不要一次做太多的监控,因为那会影响你的计算。

如果您知道程序占用了多少 CPU 时间以及代码块占用了多少时间百分比,那么您可以大致估计一个代码块占用多少 CPU 时间。

于 2011-01-06T22:09:45.907 回答