1

かなり複雑なアルゴリズム内で不要な冗長呼び出しを追跡するのに苦労しています。

(私の一部の) 私のアルゴリズムは、キャッシュされていない比較的高価な関数の (いくつかのサブルーチンでの) 冗長な呼び出しによって深刻に遅くなっているようです。これを確認するために、Dtrace を利用して、コール スタック ツリーの特定のブランチ内で単一の関数の複数の呼び出しを検出したいと思います。

dtrace に次のことを依頼できるようにしたいと思います。

  • 特定の関数内のコール スタック ツリーを検索する (ここ"foo();"では、添付の画像を参照) 重複する関数呼び出し ("c();"など)

  • それぞれの呼び出し回数でログに記録します (ここでは 3x "c();")

また、可能であれば

  • 各発生のコール スタックをログに記録します ( "foo()/a()/c()""foo()/a()/b()/c()""foo()/a()/b()/d()/c()")。

これは可能ですか?はいの場合、どのように考えていますか?

前もって感謝します!

ここに画像の説明を入力

注: 私のコードは実際には Objective-C ですが、サンプル コードでは C を使用しましたが、この種のことは言語に依存しないはずです。少なくとも一般的なアプローチ/アイデア。

4

1 に答える 1

1

私が使用する方法は、この例のようにランダム一時停止です。アイデアは、あなたが見たいのは、それらが担当する実時間で重み付けされたスタック トレースです。時間のかかる関数呼び出しサイトを優先して表示します。

それからあなたはそれらを見るだけです。スタック トレースは、それらが実行されている理由を示します。それから、それらなしで行う方法があるかどうかがわかります。そうする場合、節約される時間は、それらがスタックにあった時間の割合と同じです。

注: これを行う場合、関数がそのサイト (または任意の場所) から呼び出された回数や、実行にかかる時間を気にする必要はありません。気にする必要があるのは、コール サイトが少なくとも 2 つのサンプルのスタック上にあり、それを削除できることだけです。

于 2011-08-23T17:21:54.750 に答える