Точное время
Atom
17.02.2013
VassilSanych


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

public static class LoggingHelper
	{
		private static readonly Stopwatch _timer;
		private static readonly DateTime _startDate;
		static LoggingHelper()
		{
			_timer = new Stopwatch();
			_startDate = DateTime.Now;
			_timer.Start();
		}

		/// <summary>
		/// Текущее время.
		/// </summary>
		public static DateTime Now
		{
			get { return _startDate + _timer.Elapsed + NowOffset; }
		}

		/// <summary>
		/// Временное смещение. Неоходимо устанавливать, когда торговая программа работает с неточными настройками локального времени.
		/// Значение <see cref="Now"/> будет корректироваться в зависимости от установленного значения.
		/// </summary>
		public static TimeSpan NowOffset { get; set; }

		private static TimeSpan _timeZoneOffset = TimeZoneInfo.Local.BaseUtcOffset;

		/// <summary>
		/// Временное смещение временной зоны.
		/// </summary>
		public static TimeSpan TimeZoneOffset
		{
			get { return _timeZoneOffset; }
			set { _timeZoneOffset = value; }
		}

		/// <summary>
		/// Синхронизировать <see cref="NowOffset"/> между локальным временем на компьютере и NTP сервером в интернете.
		/// </summary>
		/// <param name="timeout">Таймаут синхронизации в милисекундах.</param>
		public static void SyncMarketTime(int timeout = 5000)
		{
			var dtNow = _startDate + _timer.Elapsed;
			NowOffset = new NtpClient().GetLocalTime(TimeZoneInfo.Local, timeout).Subtract(dtNow);
		}
.....

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


Теги:


Спасибо:


1 2  >
Mikhail Sukhov

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


VassilSanych: ODE0�

Я так понимаю, смысл в том, чтобы повысить точность передаваемого 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 же гарантирует кол-во тактов, за которое может быть выполнена операция.

Спасибо:
1 2  >

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

loading
clippy