2016-08-29 12 views
0

相互に再帰的な関数のグループをプロファイルしようとしています。私は、各機能について、他の機能に比べてどのくらいの時間がかかるかを知りたいのが望ましいです。しかし、これらの関数が相互に再帰的であるため、通常のプロファイリングではすべての関数が100%時間を費やしています。相互に再帰的な関数を効果的にプロファイルする方法

プロファイリングを行うには、再帰呼び出しに費やす時間を含めずに、各関数の包括時間を表示します。例えば、AはBとCの両方を呼び出します。 BはAを再び呼び出す。 Cは何も呼び出さない。 Aの場合、Aがコールスタックの上にあるか、A; C(上がCで、AはBではない)の割合を表示したい。私はプロファイリングがコールスタックを見るときに相互に再帰的な関数を超えて見てはいけないと思うので、スタックXAZ(最下行)はAZになり、XAZBはBになります。

私は、それぞれの関数は末尾の再帰的な形式になり、その後、末尾の呼び出しを除くすべてを別の非再帰的な関数に入れます。しかし、これは大きな書き換えであり、プログラムのパフォーマンス特性にも影響するため、理想とはほど遠いものです。

理想的には、私を助ける設定オプションを備えたプロファイラがあります。私はC#で働いています。 1つはありますか?それ以外の場合は、プロファイルセッションファイルをハックして私が望むものを得ることができると思いますか?

ありがとうございます!

答えて

0

Aがコールスタックに1回しか表示されない時間の割合を知りたいですか?いくつかのコールスタックサンプルを取得し、それらを選択します。これは少し珍しいことです。ほとんどの人は、時間Aの何分の一(そしてA内のコード行)を知りたいのですか。 つまり、Aが無料だった場合、どれくらいの時間が節約されるでしょうか? 答えは、1つのレベルであるか複数であるかにかかわらず、Aを含むサンプルのほんの一部です。

私は高速化を求めているのでスタックサンプルがmanuallyとなり、タイミングの精度はあまり重要ではありません。 もしあなたがうまくいけば、プロファイラは生のサンプルにアクセスするかもしれません。

関連する問題