使用DTrace检测调用堆栈树中的冗余函数调用

时间:2011-08-22 12:53:26

标签: optimization profiling instruments callstack dtrace

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

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

我希望能够问dtrace:

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

  • 使用各自的通话计数记录它们(此处:"c();"为3倍)

如果可能的话

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

这可能吗?如果是的话,任何想法如何?

提前致谢!

enter image description here

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

1 个答案:

答案 0 :(得分:1)

我使用的方法是random-pausing,与this example中一样。 这个想法是你想看到的堆栈跟踪加权由他们负责的挂钟时间加权。优先显示负责重要时间的函数调用站点。

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

注意:如果执行此操作,则无需关心从该站点(或任何位置)调用该函数的次数,或执行所需的时间。 您需要关心的是,呼叫站点至少有两个样本在堆栈上,并且可以将其删除。