【问题标题】:How to diagnose / profile momentary performance hit, C++如何诊断/分析瞬时性能损失,C++
【发布时间】:2014-04-23 03:32:22
【问题描述】:

已解决:当简单的分析不够有效时,我编写了一个工具来显示性能下降的位置。有关该工具如何工作的基本信息在下面接受的答案中。源代码可以在这里找到:http://pastebin.com/ETiW8hE8(一定要在你正在测试的程序中打开调试符号)

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

我正在使用 gmon 进行分析。

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

我还能做什么?

【问题讨论】:

  • 我不确定我的昂贵功能是什么,这就是我想要弄清楚的。

标签: c++ performance profiling


【解决方案1】:

我要做的是在冻结的那半秒内尝试grab a stack sample。 这将需要一个闹钟定时器设置为在未来的一小段时间,比如 100 毫秒。 然后在一些循环中,比如帧显示循环,通常需要不到 100 毫秒的重复时间,继续重置计时器。 这样,如果你不继续抚摸它,它就会像看门狗一样吠叫。

然后,在定时器中断处理程序中设置一个断点。 当它到达那里时,你知道你正处于糟糕的时期。 然后只显示调用堆栈,它应该会告诉你问题是什么。

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

【讨论】:

  • 好吧,我现在有一个程序,它期望每 X (mili) 秒输入一次,如果我不给它一些,它就会对我咆哮。所以,我在这个过程中无意中创造了另一个(糟糕的)游戏。 :) 稍后会更新。
  • 看!我的新游戏,AngryPet:pastebin.com/S0pmWjw1 ...好的,现在回去工作。我的想法是让我的游戏通过管道输出到这个,当有很大的延迟时,它会用 pstack 给我一个堆栈跟踪,正如 Soren 所提到的。
  • 知道了!在性能下降期间,我现在有一个堆栈跟踪。我仍然必须确切地研究发生了什么,但该工具似乎有效。另外,对我的调试、多线程和进程间通信技能+1!这是该工具的代码:pastebin.com/ETiW8hE8
  • 更新:该工具让我们发现了正在发生的事情:当实体模型 VBO 碰巧出现在屏幕上时,我正在打包它们,而不是在关卡加载期间。糟糕!
【解决方案2】:

你没有说你的应用程序是否是线程的,但我会假设它不是。

根据 mike 的建议,通过获取堆栈跟踪来获取洞察力并查看它在哪里冻结,如果运气好的话,您可以使用 pstack 做到这一点,所以

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

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

【讨论】:

  • 我使用 SDL,我认为它是多线程的,但我的应用程序本身不是。
  • 看起来pstackgstack 可能是一样的——手册页上写着If the process is part of a thread group, then gstack will print out a stack trace for each of the threads in the group
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多