1

我很难在一个相当复杂的算法中追踪不必要的冗余调用。

看起来(我的一些)我的算法被非缓存且相对昂贵的函数的冗余调用(在几个子例程中)严重减慢了。为了确认这一点,我想利用 Dtrace 来检测调用堆栈树的给定分支内单个函数的多个调用。

我希望能够要求 dtrace:

  • 在给定函数(此处,见附图)中搜索调用堆栈树以"foo();"查找重复的函数调用("c();"例如)

  • 用他们各自的通话次数记录他们(这里:3x for "c();"

如果可能的话

  • 记录每次出现的调用堆栈 ( "foo()/a()/c()", "foo()/a()/b()/c()", "foo()/a()/b()/d()/c()")。

这可能吗?如果是的话,知道怎么做吗?

提前致谢!

在此处输入图像描述

注意:尽管我的代码实际上是在 Objective-C 中,但我在示例代码中使用了 C,但这种事情应该与语言无关,不是吗?至少一般的方法/想法。

4

1 回答 1

1

我使用的方法是随机暂停,如本例所示。这个想法是你想看到的是堆栈跟踪由他们负责的挂钟时间加权。优先显示负责重要时间的函数调用站点。

然后你看看那些。堆栈跟踪会告诉您执行它们的原因。从那里你可以知道是否有办法没有它们。如果这样做,您节省的时间与它们在堆栈上的时间分数相同。

注意:如果你这样做,你不需要关心从那个站点(或任何地方)调用函数的次数,或者执行需要多长时间。您需要关心的是调用站点至少在两个样本的堆栈上,并且可以将其删除。

于 2011-08-23T17:21:54.750 回答