相信大家都已经使用过了windows自带的性能测试工具perfmonperfmon能够实时的抓取当前环境的硬件信息,并直观的展示出来。但是当你想在编程中利用这些数据,perfmon就不是那么方便了。那么windows是否提供了合适的api来完成这些功能呢?答案是肯定的,这就是Performance Data Helper(PDH)库。PDH库提供了一组功能强大的接口,让使用者能够方便的获取到包括CPU信息,内存信息,I/O信息等等在内的性能数据。
 
使用PDH库获取性能数据的过程如下:首先,通过打开一个查询(PdhOpenQuery()),然后在在该查询中添加需要的计数器(PdhAddCounter()),然后在合适的时间点采集数据PdhCollectQueryData(),然后在从结构PDH_FMT_COUNTERVALUE中得到数据(dhGetFormattedCounterValue())。在使用完成后,还需要关闭该查询。
 
在上面的过程中,我们需要定位到一个具体的计数器,作为api的参数。运行环境的硬件数据和OS数据的种类十分繁多,准确精炼的表示这些数据的意义是非常关键的。Windows的做法是一个被成为Counter Path的字符串表示。顾名思义,这个字符串非常类似于文件系统的文件路径。Counter Path的语法如下:
\\Computer\PerfObject(ParentInstance/ObjectInstance#InstanceIndex)\Counter
其中,Computer表示机器名或者IP地址,默认值为本机;PerfObject表示性能对象,通常为处理器,内存等等;ParentInstanceObjectInstanceInstanceIndex是可选项,在对象有多个实例的时候用到;最后,Counter表示相应的寄存器。例如:
\\127.0.0.1\Processor\% Processor Time
Counter Path表示本地的处理器的CPU利用率。将该字符串作为参数传递给PdhAddCounter就可以将该计数器添加到查询中去了。
 
读者如果想更加详细了解PDH的细节,可以在MSDN中找到相关文档。