Измерение времени выполнения кода
Я хочу знать, сколько времени занимает процедура / функция / заказ, чтобы закончить, для целей тестирования.
Это то, что я сделал, но мой метод неверен, потому что, если разница секунд равна 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)
6 ответов:
лучший способ было бы использовать секундомер, вместо
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);
вы можете использовать эту оболочку секундомер:
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
Если вы используете класс секундомера, вы можете использовать .StartNew() метод сброса часов в 0. Так что вам не нужно звонить .Сброс () следовал по .Начать.)( может пригодиться.
секундомер предназначен для этой цели и является одним из лучших способов измерения времени выполнения в .NET.
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Примечание: Если вы используете несколько потоков, вы можете рассчитать время каждого потока по отдельности и суммировать его для расчета общей продолжительности.
Comments