テストのために、手順/機能/注文が完了するまでにどれくらいの時間がかかるかを知りたい。
これは私がやったことですが、私のメソッドは間違っています '秒の差が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)
より良い方法は、DateTime
の違いの代わりに Stopwatch を使用することです。
経過時間を正確に測定するために使用できる一連のメソッドとプロパティを提供します。
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);
このストップウォッチラッパーを使用できます。
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 を使用できます
Stopwatchクラスを使用する場合、。StartNew()メソッドを使用して、時計を0にリセットできます。したがって、。Reset()を呼び出す必要はありません。Start()。が便利かもしれません。
ストップウォッチは、この目的のために設計されており、.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の時間実行を測定しないでください。
関連するスレッドがアプリケーション内でコードの実行に費やした時間を探している場合。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
注:マルチスレッドを使用している場合、各スレッドの時間を個別に計算し、合計時間を計算するために合計できます。