Точное время
Atom Ответить
17.02.2013


Раз уж есть исходники, вот небольшая доработка для тех, кому позарез нужны миллисекунды

Критика приветствуется

Теги:


Спасибо:




15 Ответов
Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти

Код

var dtNow = _startDate + _timer.Elapsed;
NowOffset = new NtpClient().GetLocalTime(TimeZoneInfo.Local, timeout).Subtract(dtNow);


Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд (DateTime.Now имеет точность до наносекунд, другое дело, что его время вычисления дискретно)?
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Mikhail Sukhov Перейти
Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд (DateTime.Now имеет точность до наносекунд, другое дело, что его время вычисления дискретно)?

Смысл в реализации Now. Остальное всё - следствия и частности.
DateTime.Now при частом вызове просто возвращает прошлые значения.
Погрешность DateTime.Now при этом составляет десятки миллисекунд.
Это не позволяет видеть время выполнения операций в логе, не запуская лишний раз профайлер.
Ну и просто лог выглядит глупо :)
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти
Это не позволяет видеть время выполнения операций в логе, не запуская лишний раз профайлер.


А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами.
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Mikhail Sukhov Перейти
А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами.

Как я написал, целью было изменить
LoggingHelper.Now
Которое используется практически везде. В частности в логах.
Синхронизация времени просто приведена в соответствие с новой логикой вычисления LoggingHelper.Now.

Автор топика
Спасибо: Mikhail Sukhov

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти

Как я написал, целью было изменить LoggingHelper.Now


Да, теперь понятно. Интересно, насколько перфоманс изменился.
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Я думал, что перфоманс моего вызова будет хуже, но не значительно, но оказалось:
На 10000 вызовов
- DateTime.Now + NowOffset = 0.0892 с
- LoggingHelper.Now = 0,0002399 с
Автор топика
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


А нет. Это наводки от прекомпиляции.
Одинаковый перфоманс.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти
А нет. Это наводки от прекомпиляции.
Одинаковый перфоманс.


_startDate = DateTime.Now;
_timer.Start();

Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Mikhail Sukhov Перейти
Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.

10000000 запусков в цикле - 1.12 с
Можно считать, нет погрешности.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти
Mikhail Sukhov Перейти
Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.

10000000 запусков в цикле - 1.12 с
Можно считать, нет погрешности.


Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминированная операция. Тоесть время может быть и практически мгновенным, а может и залипнуть на пару секунд. Это все зависит от текущей загруженности компьютера. StopWatch же гарантирует кол-во тактов, за которое может быть выполнена операция.
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Mikhail Sukhov Перейти
Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминированная операция. Тоесть время может быть и практически мгновенным, а может и залипнуть на пару секунд. Это все зависит от текущей загруженности компьютера. StopWatch же гарантирует кол-во тактов, за которое может быть выполнена операция.

Ни та, ни другая операция не залипает.
при тех же 10000000 - оба суммарных значения бегают между 0.60 и 1.3 с (сборщик мусора шалит). Так что можно считать полное отсутствие задержки в обоих случаях.
Залипают только фактические значения DateTime.Now.

Автор топика
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


PS
Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реального времени, поэтому точность StopWatch хоть и выше, но всё равно не идеальна. При этом и то, и другое одинаково зависит от общей загруженности процессора, потому что оба используют системные таймеры.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


VassilSanych Перейти
Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реального времени


Детерминированность != реальное время.

Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальное время - это гарантия скорости.
Спасибо:

VassilSanych

Фотография
Дата: 17.02.2013
Ответить


Mikhail Sukhov Перейти
Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальное время - это гарантия скорости.

Не понимаю как, "однозначность" завязана на "сложность" или на "скорость".
Я имел в виду, что детерменированные счётчики в Windows - это, наверное, только счётчики затраченных операций, и то не факт. Все остальные могут показать любые значения. По настроению. :)

Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 17.02.2013
Ответить


Залил я фикс в 4.1.8. Все равно больше плюсов, чем минусов.
Спасибо: VassilSanych


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy