如何在性能方面分析 Hiccups?

Posted

技术标签:

【中文标题】如何在性能方面分析 Hiccups?【英文标题】:How do I profile Hiccups in performance? 【发布时间】:2016-11-30 17:21:50 【问题描述】:

通常,配置文件数据是通过随机采样正在运行的程序的堆栈收集的,以查看正在执行的函数,在运行期间可以统计确定哪些方法/函数调用吃得最多遇到瓶颈时需要时间和干预。

但这与整体应用程序/游戏性能有关。有时会发生性能上的单一和孤立的打嗝,无论如何都会导致可用性问题(用户注意到它/在某些内部机制中引入了滞后等)。通过执行几秒钟的常规分析,不可能知道哪个。即使打嗝持续了足够长的时间(比如 30 毫秒,无论如何这还不够),为了检测一些被过于频繁地调用的方法,我们仍然会错过很多其他方法的执行,这些方法只是因为随机而被“跳过”抽样。

那么,在修复那些“罕见的瓶颈”之后,是否有任何技术可以分析打嗝以保持帧速率更稳定?我假设使用 C# 或 C++ 等语言。

【问题讨论】:

【参考方案1】:

这个问题之前已经回答过了,但是我找不到,所以这里...

问题是 DrawFrame 例程有时需要太长时间。 假设它通常需要不到 1000/30 = 33ms,但偶尔需要超过 33ms。

DrawFrame 的开始,设置一个定时器中断,它会在 40 毫秒后到期。 然后在 DrawFrame 结束时,禁用中断。 因此,如果它触发,您就知道 DrawFrame 会花费异常长的时间。

在中断处理程序中放置一个断点,当它到达那里时,检查堆栈。 您很有可能在做昂贵的事情的过程中发现了它。 这是random pausing 的变体。

【讨论】:

假设耗时事件在 33 ms 后开始发生 .. ehm 在 40 ms 后发生 .. @DarioOO:并不是说它在 40 毫秒后开始发生,而是在 40 毫秒后仍然发生。 我们可能会有延迟,因为通常在 1-3 毫秒之间发生的事情持续了 1 到 30 毫秒(在帧的开头)。如果使用这种方法,我们会完全错过这一点。(所以有些事件无法通过 33 毫秒的中断来捕获。 @DarioOO:这就是为什么“机会非常好”。一个聪明的程序可以弄清楚如何对你隐藏 :) 只需做一个中断,然后尝试不同的延迟。

以上是关于如何在性能方面分析 Hiccups?的主要内容,如果未能解决你的问题,请参考以下文章

简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?

Java代码如何优化?从哪些方面入手?分析

mysql性能优化-慢查询分析,优化索引最佳实践

每天一部英文动画20:Ruby’s Hiccups

性能测试包括哪些方面?

性能测试理论1 | 性能测试难点问题梳理