如何在性能方面分析 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?的主要内容,如果未能解决你的问题,请参考以下文章