我试图分析一组相互递归的函数。我希望看到每个函数相对于其他函数需要多少时间。但是由于这些函数是相互递归的,因此定期分析会显示所有函数占用100%的时间。
我想要进行的分析是显示每个函数的包含时间,而不包括它在递归调用上花费的时间。所以例如A调用B和C; B再次打电话给A;和C没有任何东西。对于A,我希望看到A在呼叫堆栈顶部的时间百分比,或A; C(C代表顶部),但不是A; B。我想在查看调用堆栈时,分析应该永远不会超出任何相互递归的函数,因此调用堆栈XAZ(从下到上)变为AZ而XAZB变为B。
我想一个解决方案是将每个函数写入尾递归形式,然后将除尾调用之外的所有函数放入一个单独的非递归函数中。然而,这将是一个很大的改写,也会影响程序的性能特征,所以它远非理想。
理想情况下,会有一个配置选项的探查器来帮助我。我在C#工作。有吗?否则你认为有可能破解配置文件会话文件以获得我想要的东西吗?
提前致谢!
答案 0 :(得分:0)
你想知道A在调用堆栈上只出现一次的时间部分吗?获取一些调用堆栈样本并选择那些。这有点不寻常。大多数人都想知道A负责的时间部分(以及A中的代码行)。 即如果A是免费的,将节省多少时间? 答案是,它只是包含A的样本的一小部分,无论是在一个级别还是多个级别。
我得到堆栈样本manually,因为我正在寻找加速,而时间精度并不那么重要。 如果你问得好的话,也许分析器会让你访问原始样本。