Альтернатива System.DateTime.Now.Ticks в .NET Micro Framework? - PullRequest
2 голосов
/ 25 июня 2011

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

Мне сказали, что я могу получить эту информацию от System.Environment.TickCount. Однако это в миллисекундах, которые являются слишком грубым измерением для того, что мне нужно. Хотя это было примерно в два раза быстрее.

Есть ли способ получить точность System.DateTime.Now.Ticks без затрат на создание System.DateTime.Now?

Ответы [ 3 ]

4 голосов
/ 25 июня 2011

Многие микроконтроллеры имеют часы реального времени, которые работают на кристалле 32768 Гц, который питает встроенный в аппарат таймер пульсации или счетчик импульсов.

Например, этот документ: http://www.ghielectronics.com/downloads/FEZ/Beginners%20guide%20to%20NETMF.pdf на стр. 91 описано использование счетчика импульсов на устройстве USBIZI.

Это также ссылки на этот документ http://www.keil.com/dd/docs/datashts/philips/lpc23xx_um.pdf который на с. 585 описывает TickCounterRegister 6.2.2 Регистр счетчика тактов (CTCR - 0xE002 4004)

Итак, вы должны быть в состоянии прочитать этот регистр, чтобы получить скользящий счет 65536 тиков. Если ваше прошедшее время составляет менее 0,5 секунд между двумя чтениями этого регистра, вычитанием со знаком и добавлением 65536, если оно меньше 0, вы получите истекшее время.

1 голос
/ 25 июня 2011

Эрик,

Точно так же, как вы понимаете, когда вы вызываете свойство Ticks DateTime, происходит то, что .NET Framework преобразует дату и время (в миллисекундах) в значение Tick.Другими словами, возвращаемое вами значение тика - это не измерение прошедшего времени, а просто преобразование структуры даты и времени, которое измеряется в миллисекундах.Вам может показаться, что вы получаете некоторое время с высоким разрешением, используя Ticks, но на самом деле миллисекунды так же хороши, как и использование DateTime в любом случае.Тиковое значение делит количество прошедших миллисекунд на что-то вроде 0x2500, и поэтому вы получаете число с высокой точностью.Но имейте в виду, что время все еще истекает в миллисекундах.

0 голосов
/ 25 июня 2011

Ответ зависит от того, на что вам нужно время. Например, если вы пытаетесь сравнить два временных экземпляра из одного и того же запущенного экземпляра вашего приложения, вы можете попробовать использовать DateTime.UtcNow, который не настроен для локали или летнего времени.

Если вам нужно инициировать событие в определенное время, используйте таймер (возможно, System.Threading.Timer, если вам так важна гранулярность, хотя System.Timers.Timer проще в использовании).

Если вам это нужно по какой-либо другой причине, пожалуйста, укажите.

...