Измерение времени выполнения кода



Я хочу знать, сколько времени занимает процедура / функция / заказ, чтобы закончить, для целей тестирования.



Это то, что я сделал, но мой метод неверен, потому что, если разница секунд равна 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)
621   6  

6 ответов:

лучший способ было бы использовать секундомер, вместо DateTime различия.

класс Stopwatch - узел MSDN

предоставляет набор методов и свойств, которые можно использовать для точно измерьте прошедшее время.

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.

вы можете использовать эту оболочку секундомер:

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

    Ничего не найдено.