Секундомер против использования System.DateTime.Now для событий синхронизации

Я хотел отслеживать производительность моего кода, поэтому я сохранил время начала и окончания, используя System.DateTime.Now . Я взял разницу между ними как время моего кода для выполнения.

Я заметил, что разница не была точной. Поэтому я попытался использовать объект Stopwatch . Это оказалось намного точнее.

Может ли кто-нибудь сказать мне, почему Stopwatch будет более точным, чем вычисление разницы между временем начала и окончания с использованием System.DateTime.Now ?

Кстати, я не говорю о десятых процента. Я получаю разницу в 15-20%.

Согласно MSDN :

Секундомер измеряет прошедшее время, подсчитывая отметки таймера в базовом таймерном механизме. Если установленная аппаратная и операционная система поддерживает счетчик производительности с высоким разрешением, то class секундомера использует этот счетчик для измерения прошедшего времени. В противном случае class секундомера использует системный таймер для измерения прошедшего времени. Используйте поля Frequency и IsHighResolution для определения точности и разрешения реализации синхронизации секундомера.

Он использует более высокое разрешение / точность, чем DateTime.Now .

Вы также можете проверить эти связанные ссылки:

Environment.TickCount против DateTime.Now

Является ли DateTime.Now лучшим способом измерения производительности функции?

DateTime достаточно хорош для точности ко второй, возможно, но что-то помимо этого я бы рекомендовал StopWatch .

Лучше использовать class секундомера, потому что он намного точнее, чем вычитание значений DateTime:

 Stopwatch s = Stopwatch.StartNew(); // Tested code here s.Stop(); Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds); 

К сожалению, этого простого fragmentа кода будет недостаточно, чтобы получить точные измерения в большинстве случаев, потому что под капотом ОС происходит много активности, что может украсть некоторое время процессора и замедлить выполнение вашего кода. Вот почему лучше всего выполнять тесты несколько раз, а затем удалять самые низкие и самые высокие времена. Для этого puprose это хорошее решение, чтобы иметь метод, который выполняет проверенный код несколько раз, удаляет самое низкое и наибольшее время и вычисляет среднее время. Я опубликовал образец метода тестирования в своем блоге .

эта функциональная ссылка для функции синхронизации обсуждает вашу точную проблему, в частности этот параграф:

Проблема в том, что согласно MSDN разрешение функции DateTime.Now составляет 10+ миллисекунд, и нам нужно позвонить ему дважды! Таким образом, это приведет к качанию 20 + ms в вашем измерении времени выполнения. Поскольку наши вызовы функций часто бывают намного быстрее, чем это 20-секундное окно, это не достаточно хорошо.

EDIT: Это похоже на второй DateTime.Now вызывается в другое время, чем когда заканчивается метод секундомера.

  • Как решить медленную Java `SecureRandom`?
  • вектор или карту, какой из них использовать?
  • MySQL: многие таблицы или многие базы данных?
  • Doxygen медленный
  • Знать какие-либо инструменты анализа журналов сбора мусора Java?
  • Что такое урожайность Скалы?
  • Что же случилось с использованием GC.Collect ()?
  • Сравнение C # и OrderBy
  • Ошибка производительности XmlSerializer при указании XmlRootAttribute
  • Легче ли оптимизировать Fortran, чем C для тяжелых вычислений?
  • Вызов метода Java vs с использованием переменной
  • Давайте будем гением компьютера.