如何诊断/描述短暂的性能命中,C ++

时间:2014-04-23 03:32:22

标签: c++ performance profiling

已解决: 因为当简单的分析不够有效时,我已经编写了一个工具来向我展示性能命中的位置。有关该工具如何工作的基本信息在下面接受的答案中。可以在此处找到源:http://pastebin.com/ETiW8hE8(确保在您正在测试的程序中打开调试符号)

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

我正在使用gmon进行个人资料。

这是一个包含许多类和函数的大型应用程序。性能只发生一次,因此在一次执行期间无法多次触发问题以使我的性能分析结果饱和,以便在分析结果中使违规函数更加明显。

我还能做什么?

2 个答案:

答案 0 :(得分:2)

我会做的是在冻结时半秒内尝试grab a stack sample。 这将需要一个闹钟定时器设置为在未来的某个小时间内关闭,如100ms。 然后在某个循环中,如帧显示循环,通常需要不到100ms的时间重复,继续重置计时器。 这样一来,如果你不去抚摸它,它就会成为一个咆哮的监督者。

然后,在定时器中断处理程序中粘贴一个断点。 当它到达那里时,你知道你处在糟糕的时间里。 然后只显示调用堆栈,它应该显示问题所在。

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

答案 1 :(得分:2)

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

根据迈克的建议,通过获取堆栈跟踪并查看它冻结的位置来获取洞察力,您可以使用pstack获得一点运气,所以

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

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