如何有效地分析相互递归函数
Posted
技术标签:
【中文标题】如何有效地分析相互递归函数【英文标题】:How to effectively profile mutually recursive functions 【发布时间】:2016-08-29 07:14:21 【问题描述】:我正在尝试分析一组相互递归的函数。最好我想看看每个函数相对于其他函数需要多少时间。然而,由于这些函数是相互递归的,因此常规分析显示所有函数都占用了 100% 的时间。
我希望我的分析做的是显示每个函数的包含时间,而不包括它花费在递归调用上的时间。例如,A 调用 B 和 C; B再次呼叫A;而 C 不调用任何东西。对于 A,我想查看 A 位于调用堆栈顶部或 A;C(C 位于顶部)而不是 A;B 的次数百分比。我想在查看调用堆栈时,分析不应该超越任何相互递归的函数,所以调用堆栈 XAZ(从下到上)变成了 AZ,而 XAZB 变成了 B。
我想一种解决方案是将每个函数写入尾递归形式,然后将除尾调用之外的所有内容放入单独的非递归函数中。然而,这将是一个很大的重写,也会影响程序的性能特征,所以它远非理想。
理想情况下,会有一个带有配置选项的分析器来帮助我。我在 C# 中工作。有吗?否则你认为有可能破解配置文件会话文件以获得我想要的吗?
提前致谢!
【问题讨论】:
【参考方案1】:您想知道 A 在调用堆栈上只出现一次的时间比例吗?获取一些调用堆栈示例并选择那些。这有点不寻常。大多数人想知道 A 负责多少时间(以及 A 中的代码行)。 即如果 A 空闲,将节省多少时间? 答案是,它只是包含 A 的样本的一小部分,无论是一级还是多于一级。
我得到了堆栈样本manually,因为我正在寻找加速,而计时精度并不那么重要。 如果您问得好,也许分析器会让您访问原始样本。
【讨论】:
以上是关于如何有效地分析相互递归函数的主要内容,如果未能解决你的问题,请参考以下文章