我很难在一个相当复杂的算法中追踪不必要的冗余调用。
看起来(我的一些人)我的算法被非缓存且相对昂贵的函数的冗余调用(在几个子例程中)严重减慢。 为了确认这一点,我想利用Dtrace来检测调用堆栈树的给定分支内的单个函数的多个调用。
我希望能够问dtrace:
搜索给定函数内的调用堆栈树(此处为"foo();"
,参见附图)以查找重复的函数调用("c();"
,例如。)
使用各自的通话计数记录它们(此处:"c();"
为3倍)
如果可能的话
"foo()/a()/c()"
,"foo()/a()/b()/c()"
,"foo()/a()/b()/d()/c()"
)。这可能吗?如果是的话,任何想法如何?
提前致谢!
注意:我在我的示例代码中使用了C,即使我的代码实际上是在Objective-C中,但是这种事情应该是与语言无关的,不应该吗?至少是一般方法/想法。
答案 0 :(得分:1)
我使用的方法是random-pausing,与this example中一样。 这个想法是你想看到的堆栈跟踪加权由他们负责的挂钟时间加权。优先显示负责重要时间的函数调用站点。
然后你看看那些。堆栈跟踪告诉您它们被执行的原因。 从那以后你就可以知道是否有办法没有它们。 如果这样做,你保存的时间与它们在堆栈上的时间相同。
注意:如果执行此操作,则无需关心从该站点(或任何位置)调用该函数的次数,或执行所需的时间。 您需要关心的是,呼叫站点至少有两个样本在堆栈上,并且可以将其删除。