如何诊断/评测瞬时性能命中,C++

How to diagnose / profile momentary performance hit, C++

本文关键字:性能 C++ 评测 何诊断 诊断      更新时间:2023-10-16

已解决: 当简单的评测不够有效时,我编写了一个工具来显示性能命中的位置。关于该工具如何工作的基本信息,请参阅下面的公认答案。来源如下:http://pastebin.com/ETiW8hE8(请确保在测试的程序中打开调试符号)

我已经用C++构建了一个游戏引擎,我注意到在一个级别的某个特定区域,有一个短暂的性能冲击。比赛将完全停止约半秒,然后愉快地继续进行。我试着对此进行了分析,但很难隔离这种情况,因为我还必须加载地图并执行导致性能下降的游戏中任务。我可以自动加载地图,跳过显示菜单等,并将这些配置文件结果与一组类似的控制数据进行比较(所有步骤都相同,但没有实际启动性能命中),但它没有显示任何明显的内容。

我正在使用gmon来配置文件。

这是一个有很多类和函数的大型应用程序。性能命中只发生一次,因此无法在一次执行中多次触发该问题,以使我的分析结果饱和,从而使有问题的函数在分析结果中更加明显。

我还能做什么?

我要做的是尝试在冻结的那半秒内获取堆栈样本。这需要设置一个闹钟计时器,以便在未来的某个小时间(如100ms)熄灭。然后在某些循环中,如帧显示循环,通常需要不到100毫秒的时间来重复,继续重置计时器。这样,如果你不一直抚摸它,它就会像看门狗一样吠叫。

然后,在计时器中断处理程序中插入一个断点。当它到达那里时,你就知道你处于糟糕的时间段。然后只需显示调用堆栈,它就会显示问题所在

您可能需要重复该过程几次。

您并没有说您的应用程序是否是线程化的,但我认为它不是。

根据mike的建议,通过在上获取堆栈跟踪来获得见解,并查看它冻结的位置,如果运气好的话,可以使用pstack来实现这一点,所以

   while usleep 100000; do 
      pstack processid
   done >/tmp/stack.log

应该会给你一些输出——我猜你正在调用一个阻塞IO操作,比如从磁盘读取一些资产。