使用 __gnu_mcount_nc 确定函数退出时间
在尝试在嵌入式平台上执行性能分析时,注意到 GCC 的 - pg 标志在每个函数的入口处插入 thunk 到 __gnu_mcount_nc 。虽然没有现成的 __gnu_mcount_nc 实现,但记录堆栈帧和当前周期计数的自定义实现已被证明在收集调用者/被调用者图表和识别频繁调用的函数方面很有用。
但是,捕获有关在仅基于入口点,功能机构仍然是一个挑战。现有的方法,例如维护影子调用堆栈和操作返回地址,会带来限制和开销。
为了解决能够捕获函数退出时间的替代 __gnu_mcount_nc 实现的问题,让我们深入研究 __gnu_mcount_nc 实现所使用的实际方法gprof.
gprof 如何测量功能Time
与最初的假设相反,gprof 不使用 __gnu_mcount_nc 来计时函数进入或退出。相反,它依赖于通过计算每个例程中的 PC 样本来收集的自时间。然后使用这些样本以及函数到函数的调用计数来估计应归因于调用者的自时间部分。
调用计数与堆栈采样
另一种方法是堆栈采样,其中涉及定期捕获堆栈样本。虽然比 PC 采样更昂贵,但它提供了更准确的测量,因为它不区分短调用和长调用,也不受 I/O 或未检测的库例程的影响。
识别昂贵的操作
发现性能瓶颈的关键在于分析原始堆栈样本并将其与源代码相关联。与关注调用图或热点不同,检查各个堆栈样本可以揭示某些操作消耗大量时间的具体原因,并提出可能的优化建议。
超越花哨的可视化
虽然火焰图和树图等可视化在视觉上很有吸引力,但它们通常无法突出显示由于从不同位置多次调用代码而产生的性能问题。按功能而不是仅根据时间对数据进行聚合和排序,可以提供更全面的代码执行视图。
结论
虽然 __gnu_mcount_nc 可以提供有关函数入口点的有价值的信息,但应考虑使用堆栈采样等替代方法来捕获函数退出时间。通过专注于分析实际的堆栈样本并避免引人注目的可视化的干扰,开发人员可以有效地识别性能瓶颈并实施优化。
以上是除了使用'__gnu_mcount_nc”之外,我们如何在性能分析中准确测量函数退出时间?的详细内容。更多信息请关注PHP中文网其他相关文章!