До сих пор я использовал DateTime.Now
для получения временных меток, но я заметил, что если вы напечатаете DateTime.Now
в цикле, вы увидите, что он увеличивается в сценариях descrete прибл. 15 мс. Но для некоторых сценариев в моем приложении мне нужно получить максимально точную метку времени, желательно с точностью до отметки (= 100 нс). Есть идеи?
Update:
По-видимому, StopWatch
/QueryPerformanceCounter
- это путь, но его можно использовать только для измерения времени, поэтому я думал о вызове DateTime.Now
, когда приложение запускается, а затем просто запускает StopWatch
а затем просто добавьте прошедшее время из StopWatch
в исходное значение, возвращаемое с DateTime.Now
. По крайней мере, это должно дать мне точную относительную метку времени, не так ли? Что вы думаете об этом (взломать)?
Примечание:
StopWatch.ElapsedTicks
отличается от StopWatch.Elapsed.Ticks
! Я использовал первый, предположив 1 tick = 100 нс, но в этом случае 1 tick = 1/StopWatch.Frequency
. Поэтому для получения тиков, эквивалентных использованию DateTime, используйте StopWatch.Elapsed.Ticks
. Я просто усвоил это.
ПРИМЕЧАНИЕ 2:
Используя подход StopWatch, я заметил, что он синхронизируется с реальным временем. Примерно через 10 часов он был впереди на 5 секунд. Поэтому я предполагаю, что придется пересинхронизировать его каждый X или около того, где X может составлять 1 час, 30 минут, 15 минут и т.д. Я не уверен, какой оптимальный промежуток времени для повторной синхронизации будет, так как каждая повторная синхронизация изменит смещение, которое может быть до 20 мс.