如何诊断/评测瞬时性能命中,C++
How to diagnose / profile momentary performance hit, C++
已解决: 当简单的评测不够有效时,我编写了一个工具来显示性能命中的位置。关于该工具如何工作的基本信息,请参阅下面的公认答案。来源如下:http://pastebin.com/ETiW8hE8(请确保在测试的程序中打开调试符号)
我已经用C++构建了一个游戏引擎,我注意到在一个级别的某个特定区域,有一个短暂的性能冲击。比赛将完全停止约半秒,然后愉快地继续进行。我试着对此进行了分析,但很难隔离这种情况,因为我还必须加载地图并执行导致性能下降的游戏中任务。我可以自动加载地图,跳过显示菜单等,并将这些配置文件结果与一组类似的控制数据进行比较(所有步骤都相同,但没有实际启动性能命中),但它没有显示任何明显的内容。
我正在使用gmon来配置文件。
这是一个有很多类和函数的大型应用程序。性能命中只发生一次,因此无法在一次执行中多次触发该问题,以使我的分析结果饱和,从而使有问题的函数在分析结果中更加明显。
我还能做什么?
我要做的是尝试在冻结的那半秒内获取堆栈样本。这需要设置一个闹钟计时器,以便在未来的某个小时间(如100ms)熄灭。然后在某些循环中,如帧显示循环,通常需要不到100毫秒的时间来重复,继续重置计时器。这样,如果你不一直抚摸它,它就会像看门狗一样吠叫。
然后,在计时器中断处理程序中插入一个断点。当它到达那里时,你就知道你处于糟糕的时间段。然后只需显示调用堆栈,它就会显示问题所在
您可能需要重复该过程几次。
您并没有说您的应用程序是否是线程化的,但我认为它不是。
根据mike的建议,通过在上获取堆栈跟踪来获得见解,并查看它冻结的位置,如果运气好的话,可以使用pstack来实现这一点,所以
while usleep 100000; do
pstack processid
done >/tmp/stack.log
应该会给你一些输出——我猜你正在调用一个阻塞IO操作,比如从磁盘读取一些资产。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?