Performance (开源)

January 10th, 2013

Performance是一个我维护了很多年的c/c++性能监控工具,曾经用在很多个项目中。

利用它能充分掌握程序运行时的关键数据,快速定位性能瓶颈,是优化的好工具。

这个工具的数据采集部分最早来源于Greg Hjeistrom和Byon Garrabrant发表在Game Programming Gems(游戏编程精粹) 3上的代码,我修改了一下并添加了一个数据浏览工具PerfSpy。没有太多的技术含量,但是要从头写一个还挺费时间。现在把所有代码共享,希望能使更多人受益。

下载Performance

压缩包里包含Performance工程,PerfSpy工程以及一个使用范例Test工程。

使用步骤

  1. 将Performance工程(静态库)加入待评估项目,或者直接将Performance.h;.cpp加入目标工程
  2. 程序初始化时调用perf::createManager();
  3. 在需要评估性能的代码处添加采样节点PERF_NODE_FUNC或PERF_NODE(name)
  4. 如果需要的话,每帧调用一次perf::incrementFrameCount();
  5. 每隔一段时间(一两秒为宜,不宜过于频繁)调用一次perf::saveDataFrame()保存性能评估数据,保存之后调用perf::reset();清空当前采样数据,重新开始评估
  6. 在工程设置中添加_PERFORMANCE编译开关来打开采样节点的功能,如果不再需要评估,删除这个开关即可,Performance不会对项目有任何影响

注意事项

  1. Performance现在支持多线程性能剖析,请设置MAX_THREAD_COUNT宏的值,指定需要剖析的最大线程数。注意,如果不需要多线程剖析,请把该常量设置为1,以遍获得最高性能
  2. 节点名称如果自定义的话,必须是const char*类型
  3. 该系统是通过直接读取寄存器获取时间信息,所以如果在多CPU(或者多核)的机器上运行,必须使用SetThreadAffinityMask将相应线程绑定到特定CPU,否则可能会产生评估结果混乱的情况。
  4. 单个采样节点的时间开销很小,在目前的主流CPU上大约是0.1微秒数量级,但采样仍然不能滥用,尽量避免在开销很小,调用频率极高的代码段添加采样节点
  5. 代码中添加的一个节点,在评估结果中可能会出现多个同名的副本,因为它可能会被不同的父节点调用

PerfSpy界面
Performance
使用中遇到任何问题,请联系我

  1. No comments yet.
  1. September 10th, 2009 at 01:25 | #1
Comments are closed.