Раз уж есть исходники, вот небольшая доработка для тех, кому позарез нужны миллисекунды
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);
}
.....
Критика приветствуется
Комментарии (15)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд (DateTime.Now имеет точность до наносекунд, другое дело, что его время вычисления дискретно)?
А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами.
Да, теперь понятно. Интересно, насколько перфоманс изменился.
Я думал, что перфоманс моего вызова будет хуже, но не значительно, но оказалось: На 10000 вызовов
А нет. Это наводки от прекомпиляции. Одинаковый перфоманс.
_startDate = DateTime.Now; _timer.Start();
Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.
Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминированная операция. Тоесть время может быть и практически мгновенным, а может и залипнуть на пару секунд. Это все зависит от текущей загруженности компьютера. StopWatch же гарантирует кол-во тактов, за которое может быть выполнена операция.
PS Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реального времени, поэтому точность StopWatch хоть и выше, но всё равно не идеальна. При этом и то, и другое одинаково зависит от общей загруженности процессора, потому что оба используют системные таймеры.
Детерминированность != реальное время.
Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальное время - это гарантия скорости.
Залил я фикс в 4.1.8. Все равно больше плюсов, чем минусов.