Performance (开源)
July 25th, 2010
Performance是一个我维护了很多年的c/c++性能监控工具,曾经用在很多个项目中。
利用它能充分掌握程序运行时的关键数据,快速定位性能瓶颈,是优化的好工具。
这个工具的数据采集部分最早来源于Greg Hjeistrom和Byon Garrabrant发表在Game Programming Gems(游戏编程精粹) 3上的代码,我修改了一下并添加了一个数据浏览工具PerfSpy。没有太多的技术含量,但是要从头写一个还挺费时间。现在把所有代码共享,希望能使更多人受益。
压缩包里包含Performance工程,PerfSpy工程以及一个使用范例Test工程。
使用步骤
- 将Performance工程(静态库)加入待评估项目,或者直接将Performance.h;.cpp加入目标工程
- 程序初始化时调用PerfManager::createTheOne();
- 在需要评估性能的代码处添加采样节点PERF_NODE_FUNC或PERF_NODE(name)
- 如果需要的话,每帧调用一次PerfManager::getTheOne()->IncrementFrameCounter();
- 每隔一段时间(一两秒为宜,不宜过于频繁)调用一次PerfManager::getTheOne()->SaveDataFrame()保存性能评估数据,保存之后调用PerfManager::getTheOne()->Reset();清空当前采样数据,重新开始评估
- 在工程设置中添加_PERFORMANCE编译开关来打开采样节点的功能,如果不再需要评估,删除这个开关即可,Performance不会对项目有任何影响
注意事项
- 为了效率考虑,Performance不是线程安全的,只能在一个线程内使用。请确认所有节点所在的函数都只会在同一个线程被调用
- 节点名称如果自定义的话,必须是const char*类型
- 该系统是通过直接读取寄存器获取时间信息,所以如果在多CPU(或者多核)的机器上运行,必须使用SetThreadAffinityMask将相应线程绑定到特定CPU,否则可能会产生评估结果混乱的情况。
- 单个采样节点的时间开销很小,在目前的主流CPU上大约是0.1微秒数量级,但采样仍然不能滥用,尽量避免在开销很小,调用频率极高的代码段添加采样节点
- 代码中添加的一个节点,在评估结果中可能会出现多个同名的副本,因为它可能会被不同的父节点调用
PerfSpy界面

使用中遇到任何问题,请联系我