Точное время
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 
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
< 1 2 

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

loading
clippy