Я хочу знать, сколько времени требуется для завершения процедуры/функции/заказа для целей тестирования.
Это то, что я сделал, но мой метод ошибочен, потому что если разница секунд равна 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)
Лучше всего использовать Stopwatch вместо различий DateTime
.
Предоставляет набор методов и свойств, которые можно использовать для точно измерять прошедшее время.
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);
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
.
Stopwatch
в верхней части каждой строки и остановите его после каждой строки. Помните, что вам нужно также использовать Stopwatch.Reset
после каждой отдельной строки для расчета. На основе вашей линии; посмотрите ideone.com/DjR6ba
Вы можете использовать эту оболочку секундомера:
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:"))
{
... yout code here
}
Вывод:
Insert 10 records: 00:00:00.0617594
Для расширенных сценариев вы можете использовать Benchmark.It или NBench
Если вы используете класс секундомера, вы можете использовать метод .StartNew() для reset для часов до 0. Поэтому вам не нужно вызывать .Reset(), а затем .Start(). Может пригодиться.
Секундомер предназначен для этой цели и является одним из лучших способов измерения времени выполнения в .NET.
var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;
Не используйте DateTimes для измерения времени выполнения в .NET.