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

Optimization 使用DTrace检测调用堆栈树中的冗余函数调用,optimization,profiling,instruments,callstack,dtrace,Optimization,Profiling,Instruments,Callstack,Dtrace,我很难在一个相当复杂的算法中找到不必要的冗余调用 看起来(我的一些)我的算法由于对非缓存且相对昂贵的函数的冗余调用(在几个子例程中)而严重减慢。 为了确认这一点,我想利用Dtrace在调用堆栈树的给定分支中检测单个函数的多个调用 我希望能够要求dtrace: 搜索给定函数中的调用堆栈树(此处为“foo();”,请参阅附图)以查找重复的函数调用(“c();”,例如) 记录它们各自的调用计数(此处:3x表示“c();”) 如果可能的话 记录每次事件的调用堆栈(“foo()/a()/c()”,“

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

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

我希望能够要求dtrace:

  • 搜索给定函数中的调用堆栈树(此处为
    “foo();”
    ,请参阅附图)以查找重复的函数调用(
    “c();”
    ,例如)

  • 记录它们各自的调用计数(此处:3x表示
    “c();”

如果可能的话

  • 记录每次事件的调用堆栈(
    “foo()/a()/c()”
    “foo()/a()/b()/c()”
    “foo()/a()/b()/d()/c()”
这可能吗?如果是,你知道怎么做吗

提前谢谢

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

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

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

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

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

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

注意:如果您这样做,您不需要关心从该站点(或任何地方)调用函数的次数,也不需要关心执行该函数需要多长时间。 您需要关心的是,调用站点位于至少两个示例的堆栈上,并且它可以被删除