3

アプリケーションのコンテキスト内でさまざまなメソッドの実行を測定する必要があります。

もちろん、.NET には Stopwatch クラスがあり、.Start() および .Stop() メソッドを使用してコードのセクションの時間を簡単に計ることができます。

ただし、通常の方法で Stopwatch クラスを使用するには、すべてのメソッドを Stopwatch オブジェクトのインスタンスで修飾し、その .Start() および .Stop() メソッドを呼び出す必要があります。

文字通り何百ものメソッドでストップウォッチ機能を使用する必要があり、このコードですべてのメソッドを汚染したくありません。また、タイミングのオンとオフを切り替える機能が欲しいです。

自分のコード内に汎用タイミング ソリューションを実装できる簡単な方法はありますか? もしそうなら、どのように?コードプロファイラーがそれを行うので、それは可能であるに違いないと思います。

4

2 に答える 2

10

ちょっとした考え。以下のようにメソッドを宣言します

public static long Measure(Action action)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    return sw.ElapsedMilliseconds;
}

として使用します

var duration = Measure(() => MyMethod(param1));
于 2012-09-13T18:56:37.620 に答える
1

また、AOP を調べて、タイミング メソッドのラッパーを動的に作成することもできます (ただし、静的でないパブリック メソッドでのみ機能します)。

IoC を使用している場合、基本的に型をデコレータに登録するだけで済みます。もちろん、これはカスタマイズして、必要に応じてオンまたはオフにすることができます。また、特定のメソッドでも可能です。

これを実現するために以前に Castle:DynamicProxy を使用しました (タイミングとエラー ログの両方)。

編集:例(城の古いバージョンから:動的プロキシ)

TimerInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        invocation.Proceed();
        watch.Stop();
        //here you have the value which could be used to log (which I assume you want)
    }
}

new ProxyGenerator().CreateInterfaceProxyWithTarget<IMyInterface>(implementedObject, new TimerInterceptor());
于 2012-09-13T19:21:13.567 に答える