web-dev-qa-db-ja.com

コード実行時間の測定

テストのために、手順/機能/注文が完了するまでにどれくらいの時間がかかるかを知りたい。

これは私がやったことですが、私のメソッドは間違っています '秒の差が0の場合、経過したミリ秒を返すことができないためです:

スリープ値は500ミリ秒なので、経過秒数は0であるため、ミリ秒を返すことはできません。

    Dim Execution_Start As System.DateTime = System.DateTime.Now
    Threading.Thread.Sleep(500)

    Dim Execution_End As System.DateTime = System.DateTime.Now
    MsgBox(String.Format("H:{0} M:{1} S:{2} MS:{3}", _
    DateDiff(DateInterval.Hour, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Minute, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End), _
    DateDiff(DateInterval.Second, Execution_Start, Execution_End) * 60))

誰かがこれを行うためのより良い方法を教えてもらえますか?多分TimeSpanで?

ソリューション:

Dim Execution_Start As New Stopwatch
Execution_Start.Start()

Threading.Thread.Sleep(500)

MessageBox.Show("H:" & Execution_Start.Elapsed.Hours & vbNewLine & _
       "M:" & Execution_Start.Elapsed.Minutes & vbNewLine & _
       "S:" & Execution_Start.Elapsed.Seconds & vbNewLine & _
       "MS:" & Execution_Start.Elapsed.Milliseconds & vbNewLine, _
       "Code execution time", MessageBoxButtons.OK, MessageBoxIcon.Information)
96
ElektroStudios

より良い方法は、DateTimeの違いの代わりに Stopwatch を使用することです。

ストップウォッチクラス-Microsoft Docs

経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。

Stopwatch stopwatch = Stopwatch.StartNew(); //creates and start the instance of Stopwatch
//your sample code
System.Threading.Thread.Sleep(500);
stopwatch.Stop();
Console.WriteLine(stopwatch.ElapsedMilliseconds);
201
Habib

Stopwatch 経過時間を測定します。

// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();

// Begin timing
stopwatch.Start();

Threading.Thread.Sleep(500)

// Stop timing
stopwatch.Stop();

Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

DEMO です。

52
Soner Gönül

このストップウォッチラッパーを使用できます。

public class Benchmark : IDisposable 
{
    private readonly Stopwatch timer = new Stopwatch();
    private readonly string benchmarkName;

    public Benchmark(string benchmarkName)
    {
        this.benchmarkName = benchmarkName;
        timer.Start();
    }

    public void Dispose() 
    {
        timer.Stop();
        Console.WriteLine($"{benchmarkName} {timer.Elapsed}");
    }
}

使用法:

using (var bench = new Benchmark($"Insert {n} records:"))
{
    ... your code here
}

出力:

Insert 10 records: 00:00:00.0617594

高度なシナリオでは、 Benchmark.It または NBench を使用できます

37
Alex Erygin

Stopwatchクラスを使用する場合、。StartNew()メソッドを使用して、時計を0にリセットできます。したがって、。Reset()を呼び出す必要はありません。Start()。が便利かもしれません。

12

ストップウォッチは、この目的のために設計されており、.NETでの時間実行を測定する最良の方法の1つです。

var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

DateTimesを使用して.NETの時間実行を測定しないでください。

2
Sam

関連するスレッドがアプリケーション内でコードの実行に費やした時間を探している場合。
ProcessThread.UserProcessorTime名前空間で取得できるSystem.Diagnosticsプロパティを使用できます。

TimeSpan startTime= Process.GetCurrentProcess().Threads[i].UserProcessorTime; // i being your thread number, make it 0 for main
//Write your function here
TimeSpan duration = Process.GetCurrentProcess().Threads[i].UserProcessorTime.Subtract(startTime);

Console.WriteLine($"Time caluclated by CurrentProcess method: {duration.TotalSeconds}"); // This syntax works only with C# 6.0 and above

注:マルチスレッドを使用している場合、各スレッドの時間を個別に計算し、合計時間を計算するために合計できます。

1