#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.
Комментариев нет:
Отправить комментарий