Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

C# Получить среднее время выполнения 10 операций

#c_sharp #datetime


В коде выполняются 10 операций:

var start = DateTime.Now;
Foo();
var end = DateTime.Now;


Задача: сложить разницу end - start всех 10 операций и получить среднее значение

Сделал так, но результаты явно неверные:

var time = result.Aggregate(time, (current, finalResult) => current + (end - start));
Console.WriteLine(new DateTime(time.Ticks / Count).ToString("mm:ss.fff"));

    


Ответы

Ответ 1



Вам стоит использовать Stopwwatch вместо DateTime. Stopwatch как раз предназначен для точного измерения промежутков времени, в частности, времени выполнения участков кода. Во-первых, он имеет бОльшую, нежели DateTime, разрешающую способность (DateTime не сможет корректно измерить короткие промежутки порядка одной миллисекунды и меньше), во-вторых, пусть даже теоретически, но возможна ситуация, когда во время выполнения вашего кода произойдёт какая-либо коррекция времени системы, что чревато неправильным измерением (скажем, произойдёт перевод времени). Плюс оперировать с миллисекундами и тиками системного таймера проще, чем с датами и TimeSpan'ами. Для решения вашей задачи поступите самым простым способом - 10 раз измерьте время выполнения кода в миллисекундах или тиках, сложите и поделите на 10, элементарная арифметика

Ответ 2



В Windows есть QueryPerformanceCounter -- таймер высокого разрешения. В .NET есть его обертка -- Stopwatch (исходный код тут). Если надо получить среднее время выполнения метода/функции, то пишем так long Tester(int count, Action fn) { var s = System.Diagnostics.Stopwatch.StartNew(); for (var i = 0; i < count; i++) fn(); s.Stop(); return s.ElapsedTicks; } var ticks = Tester(10, () => Foo()); // тестируем Foo var avg = ticks / 10; // среднее var ms = TimeSpan.FromTicks(ticks).Milliseconds; UPDATE Если результаты тестов, а также разную отладочную информацию (до 500 тыс. сообщений в секунду) надо выводить в лог, то можно использовать ETW.

Комментариев нет:

Отправить комментарий