2012-03-18 12 views
3

私は小さなアクション(ページあたり10-30)が多く、再帰呼び出しの一部であるため、プロファイラで単一のステップとしてカウントできません。私は合計が必要なときに30の短いカウンターと別個のカウンターを得ます。MVCミニプロファイラ - 手動で追加するステップ

ミニプロファイラーに手作業を手動で追加する簡単で簡単な方法はありますか?同じ名前のステップを集計することもできますか?

また、タイミングだけでなく、何らかの形でテキスト情報を入れることは可能ですか?

答えて

0

再帰呼び出しをusingステートメント内で「折り返し」したいとします。このようなもの:

using (profiler.Step("Step A")) 
    { 
     // something recursive here 
     Thread.Sleep(100); 
    } 

「ステップA」は通話の合計になります。そのステートメントを使って、あなたは何でもしたいことができます。 「ステップA」は、どんな情報でもかまいません。任意の文字列値をそこに置くことができ、それはプロファイラに表示されます。また、使用せずに「ステップ」を行うだけで簡単なテキスト情報を追加することもできます。

MiniProfiler.Current.Step("Some code after this"); 

これで、プロファイラ出力ウィンドウに1行だけ挿入されます。私はそれを例外やその他のデバッグ情報を吐き出すために使ってきました。

+0

私は全体をラップしたくありません。再帰メソッド内の特定のコードがどれくらい時間がかかるかを測定したいだけです。私は自分でそれを測定してから、ステップ名にタイミングを追加することができると思います...しかし、それはいつも些細なセクションにあるでしょう、タイミングが間違っているなど...私はそこにきれいな方法があることを望みましたそれは – Madd0g

+0

今日これで少し遊んだので、あなたが望むことをするきれいな方法を見つけることができませんでした。タイミングの持続時間を子供で手動で設定することはできますが、ネストされた階層と実際の持続時間が混乱します。私のテストに基づいて、それは負の継続時間が出てくるので、とにかく "簡単な"セクションに現れます。 http://code.google.com/p/mvc-mini-profiler/issues/listここに機能リクエストとして提出することをお勧めします –

2

私もこれが必要でしたので、私はこの小さな事を作ったのです。それはかなりうまくいく。 MiniProfilerの多くの便利なプロパティは内部的にも類似しているので、MiniProfilerソースからいくつかのコードが複製されています。また、内部ループのためには1/10ミリ秒に丸められないので注意してください。

public class GroupTiming : IDisposable 
{ 
    private Timing _timing; 
    private MiniProfiler _profiler; 
    private readonly Stopwatch _sw; 

    public GroupTiming(MiniProfiler profiler, Timing timing) 
    { 
     _timing = timing; 
     _profiler = profiler; 
     _profiler.Head = _timing; 
     _sw = new Stopwatch(); 
     _sw.Start(); 
    } 

    public void Dispose() 
    { 
     _timing.DurationMilliseconds += (decimal)(1000*_sw.ElapsedTicks)/(decimal)Stopwatch.Frequency; 
     _profiler.Head = _timing.ParentTiming; 
    } 
} 

public static class MiniProfilerExtensions 
{ 
    public static IDisposable StepGroup(this MiniProfiler profiler, string name) 
    { 
     return profiler == null ? null : profiler.StepGroupImpl(name); 
    } 

    private static IDisposable StepGroupImpl(this MiniProfiler profiler, string name) 
    { 
     Timing timing = null; 

     if(profiler.Head.Children != null) 
     { 
      timing = profiler.Head.Children.SingleOrDefault(_ => _.Name == name); 
     } 

     if(timing == null) 
     { 
      using(timing = new Timing(profiler, profiler.Head, name)) { } 
     } 

     return new GroupTiming(profiler, timing); 
    } 
} 
関連する問題