1

メソッドの実行にかかる時間をテストしたかったのですが、timespan が最適な方法であるかどうか疑問に思っていました。メソッドの開始と終了をログに記録したくありません。既存のログ ファイルの作成と更新に時間がかかるため、ログを記録しても正確な時間を読み取れないと聞いたからです。タイムスパンが最善の方法ではない場合、これを行うための良い方法について何か提案はありますか?

4

5 に答える 5

6

この種のことのために設計された Stopwatch クラスを使用するのが最善です。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
DoSomething();
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
于 2012-10-11T17:49:25.340 に答える
3
var duration = Measure(() => YourFunction(param1));

long Measure(Action action)
{
    Stopwatch sw = Stopwatch.StartNew();
    action();
    return sw.ElapsedMilliseconds;
}
于 2012-10-11T17:52:24.540 に答える
2

Stopwatchクラスを使用する必要があります:

public void Foo()
{
    var sw = Stopwatch.StartNew();
    // Do work...
    var totalTime = sw.Elapsed;
}

私はよく、これを処理するためのユーティリティ メソッドを作成します。

public static void ComputeTimings(Action method, string methodName)
{
    var sw = Stopwatch.StartNew();
    method();
    sw.Stop();
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}

これは、次のように呼び出すことができます。

ComputeTimings(() => Foo(bar), "Foo");

これは、実際のメソッド本体を変更することなく、タイミングをコードに「注入」して、必要に応じて削除できるため便利です。

また、非常に正確なタイミングを得るには、多くの場合、メソッドを少なくとも2 回実行する必要があることに注意してください。メソッドの初回実行時は、JIT コンパイラーが原因でタイミングがずれる場合があります。必要に応じて、上記のメソッドにそれを組み込むことができます。

public static void ComputeTimings(Action method, string methodName, bool executeOnceFirst = true)
{
    if (executeOnceFirst) 
        method();

    var sw = Stopwatch.StartNew();
    method();
    sw.Stop();
    Debug.WriteLine("Method {0} took {1}", methodName, sw.Elapsed);
}
于 2012-10-11T17:50:29.597 に答える
2

私はStopwatch自分のコードの時間を計っていました。

 var sw = new Stopwatch();
 sw.Start()
 //code to time here
 sw.Stop();
 Console.WriteLine("Time taken in milliseconds: " + sw.ElapsedMilliseconds);

ストップウォッチを使用すると、タイミングをかなり細かく調整できます。これを使用して、ネストされた実行をテストし、複数のループ反復にかかる時間を平均化しました。

複数の反復をテストするには、次のようにします。

var sw = new Stopwatch();
List<long> totalTime = new List<long>();

for (var u = 0; u < 100000; u++)
{
    sw.Start();
    //logic here
    sw.Stop();
    totalTime.Add(sw.ElapsedMilliseconds);
    sw.Reset();
}
Console.WriteLine("Average time in Milliseconds: {0}", totalTime.Average());
于 2012-10-11T17:48:56.137 に答える
2

Stopwatch クラスを使用します。

于 2012-10-11T17:49:20.980 に答える