2011-08-22 40 views
1

我很難在相當複雜的算法中追蹤不必要的冗餘調用。使用DTrace檢測調用堆棧樹內的多餘函數調用

看起來像(我的一些)我的算法被一個非緩存和相對昂貴的函數的冗餘調用(在幾個子例程中)嚴重減慢。 爲了證實這一點,我想利用Dtrace檢測調用堆棧樹的給定分支內的單個函數的多個調用。

我希望能問的DTrace到:

  • 給定函數中搜索調用堆棧樹(這裏"foo();",見附件圖片)重複函數調用("c();",如)

  • 記錄它們各自的調用次數(此處爲3倍"c();"

,如果可能,還

  • 日誌每次出現時("foo()/a()/c()""foo()/a()/b()/c()""foo()/a()/b()/d()/c()")的調用堆棧。

這可能嗎?如果是的話,任何想法如何?

在此先感謝!

enter image description here

注:我用下,在我的示例代碼,即使我的代碼實際上是在Objective-C,但這種事情應該是一種語言無關的,不應該嗎?至少一般的方法/想法。

回答

1

我使用的方法是random-pausing,如this example。 這個想法是你想看到的是由它們負責的掛鐘時間加權的堆棧軌跡。優先顯示負責大量時間的功能呼叫站點。

然後,你只要看看那些。堆棧跟蹤告訴你他們爲什麼被執行。 從這裏你可以分辨出沒有它們的方法。 如果你這樣做,你保存的時間和他們在堆棧上的時間分數是一樣的。

注意:如果您這樣做,則無需關心從該站點(或任何位置)調用函數的次數,或執行所需的時間。 您需要關心的是呼叫站點至少在兩個樣本上堆疊,並且可以將其移除。