0

さまざまな方法で要した時間をログに記録する必要があります。エンタープライズ サーバー アプリケーションのコード ブロックは、現在ストップウォッチを使用しています。実装したサンプル コードは次のとおりです。

var sw = new Stopwatch();
sw.Start();
DoSomething();
sw.Stop();
logManager.LogInformation(String.Format("Time taken by DoSomething function is {0} ms.", sw.ElapsedMilliseconds));

私は多くの .cs ファイルの多くの場所でこのように書いています。時間を測定するための一般的な方法または拡張機能を 1 つ記述することで、この手作業を減らしたかっただけです。このために、実際の方法を次のような時間測定方法でラップすることを考えています。

long elapsedMilliseconds = ExecuteAndGetTimeTaken(this.DoSomething());

または、次のような一般的な拡張メソッド

long elapsedMilliseconds = this.DoSomething().GetTimeTaken();

メソッドが時間とともにメッセージをログに記録する場合は素晴らしいでしょう。

long elapsedMilliseconds = ExecuteAndGetTimeTaken(this.DoSomething(),logManager,message);

目的を解決するために共通のクラス/メソッドまたは拡張機能を記述する方法は?

4

2 に答える 2

6

これは次のことを行う必要があります。

void ExecuteAndMeasureTimeTaken(Action action, string message)
{
    if(action == null) throw new ArgumentNullException();
    else
    {
        var sw = new Stopwatch();
        sw.Start();

        action();

        sw.Stop(); 

        LogMessage(message , sw.ElapsedMilliseconds);
    }
}

次のように呼び出します。

logManager.ExecuteAndMeasureTimeTaken(() => GC.Collect(), "Time taken by GC after each Listning is {0} ms.");

本当に LogManager パラメータが必要ですか?

その場合、これを LogManager 自体に追加できます。

于 2013-05-20T11:03:35.597 に答える
2

usingステートメントで使用できる短いクラスを一度作成しました。もう1つの利点は、例外がスローされた場合、時間も測定されることです

/// <summary>
/// Provides a easy to use timer. 
/// Usage
/// using(new DiagnosticTimer())
/// {
///     // do anything
/// }
/// </summary>
public class DiagnosticTimer : IDisposable
{
    public System.Diagnostics.Stopwatch StopWatch { get; protected set; }
    public string Message { get; set; }

    public DiagnosticTimer()
    {
        Message = "Diagnostic Timer at " + new System.Diagnostics.StackTrace().GetFrame(1).ToString();
        StopWatch = new System.Diagnostics.Stopwatch();
        StopWatch.Start();
    }
    public DiagnosticTimer(string Message)
    {
        this.Message = Message;
        StopWatch = new System.Diagnostics.Stopwatch();
        StopWatch.Start();
    }

    public void Dispose()
    {
        StopWatch.Stop();
        System.Diagnostics.Trace.WriteLine(Message + StopWatch.Elapsed.ToString());
    }

}
于 2013-05-20T11:41:31.883 に答える