Вы не говорите, как быстро вы ожидаете, что каждый GetValue
звонок завершится, поэтому трудно дать какой-либо определенный совет ...
Для вещей, которые занимают определенное количество миллисекунд (доступ к диску, заполнение элементов управления, передача по сети и т. Д.), Я использовал DateTime.Ticks.Now
. Кажется, он работает достаточно хорошо, и заявленное разрешение 10 000 000 тиков в секунду звучит довольно хорошо. (Я сомневаюсь, что это действительно так точно; я не знаю, на каком объекте это поддерживается.)
Я не знаю ни одного способа избежать искажений, вызванных выполнением других процессов. Обычно я просто беру среднее время, затрачиваемое на выполнение каждого интересующего меня раздела, усредняется по максимально возможному количеству запусков (чтобы сгладить изменения, вызванные другими процессами и любыми неточностями таймера).
(В нативном коде для профилирования вещей, выполнение которых не занимает много времени, я использую счетчик циклов ЦП с помощью инструкции RDTSC
. Поэтому, если вы рассчитываете время, которое слишком рано для других таймеров, чтобы его получить полезное чтение, но оно не заканчивается так быстро, что проблемы с вызовами являются проблемой, и вы не возражаете получать показания в циклах ЦП, а не в стандартных единицах времени, возможно, стоит написать небольшую встроенную функцию, которая возвращает цикл значение счетчика в UInt64
. Мне не нужно было делать это в управляемом коде сам, хотя ...)