У нас есть журналы приложений, которые записывают информацию о производительности для различных дорогостоящих операций. Мы используем как Stopwatch
, так и DateTime.UtcNow
в нашем протоколировании, и мы находим, что эти значения могут отличаться МНОГО больше, чем можно было бы ожидать, даже при условии точности DateTime.UtcNow ~ 20 мс. Мой вопрос: Что может быть причиной этого и может быть исправлено?Секундомер и DateTime.UtcNow, производящие неожиданно большие временные изменения
Информация записанная:
- время_запуска (
DateTime.UtcNow
) - Продолжительность (
TimeSpan.FromSeconds((after - before)/(double)Stopwatch.Frequency)
, гдеafter
иbefore
являются значенияStopwatch.GetTimestamp()
в начале и в конце операции - EndTime (
DateTime.UtcNow
)
Вы ожидали бы, что EndTime будет близок к StartTime + Duration, но в некоторых случаях это далеко от. Мы опробовали 10000 таких измерений, ища случаи, когда EndTime и (StartTime + Duration) отличались более чем на 20 мс. Мы обнаружили следующее:
- ~ 2% записей выключены на> 20мс
- Из них, они выключены в среднем 100мс (макс является 1.4seconds)
- Из них, в некоторых случаях секундомер рассчитанных конечное времени больше, чем DateTime на основе конечного времени, но в большинстве случаев секундомера время меньше
машина Информация
- Windows Server 2012 R2 Hyper-V VM работает поверх Windows Server 2012 R2
- 32GB барана для VM, 8 виртуальных процессоров
Вот часть [статьи] (http://tech.pro/tutorial/1295/c-performance-benchmark-mistakes-part-two) Эрика Липперта о том, почему секундомер лучше, чем вызовы 'DateTime.Now 'для определения того, сколько времени прошло в программе. – juharr
@Chase Могу ли я спросить вас о длительности измеренных операций? Секунды? Минуты? Часы? – xanatos
Взгляните на https://msdn.microsoft.com/en-us/library/system.datetime.utcnow%28v=vs.110%29.aspx, похоже, что utcnow имеет приблизительное разрешение около 10 миллисекунд, поэтому что может объяснить некоторые различия, которые вы наблюдаете. –