Точное время~/topic/3404/tochnoe-vremya/Copyright @ StockSharp Platform LLC 2010 - 20242024-03-28T09:22:27Zhttps://stocksharp.ru/images/logo.pnghttps://stocksharp.ru/posts/m/24095/Залил я фикс в 4.1.8. Все равно больше плюсов, чем минусов.2013-02-17T18:07:46Z2013-02-17T18:07:46ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ruЗалил я фикс в 4.1.8. Все равно больше плюсов, чем минусов.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24094/Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальн...2013-02-17T18:03:22Z2013-02-17T18:03:22ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24093/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальное время - это гарантия скорости.</div></div><br />Не понимаю как, "однозначность" завязана на "сложность" или на "скорость".<br />Я имел в виду, что детерменированные счётчики в Windows - это, наверное, только счётчики затраченных операций, и то не факт. Все остальные могут показать любые значения. По настроению. :) <br /><br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24093/Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реально...2013-02-17T17:51:20Z2013-02-17T17:51:20ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24092/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реального времени</div></div><br /><br />Детерминированность != реальное время.<br /><br />Грубо говоря, детерминированность - это сложность алгоритма (не путать со сложностью кода). А реальное время - это гарантия скорости.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24092/PS Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реал...2013-02-17T17:44:08Z2013-02-17T17:44:43ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruPS<br />Если это и имелось в виду под детерменированностью, то должен огорчить: Windows - не система реального времени, поэтому точность StopWatch хоть и выше, но всё равно не идеальна. При этом и то, и другое одинаково зависит от общей загруженности процессора, потому что оба используют системные таймеры.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24091/Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминиро...2013-02-17T17:34:37Z2013-02-17T17:34:37ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24090/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминированная операция. Тоесть время может быть и практически мгновенным, а может и залипнуть на пару секунд. Это все зависит от текущей загруженности компьютера. StopWatch же гарантирует кол-во тактов, за которое может быть выполнена операция.</div></div><br />Ни та, ни другая операция не залипает. <br />при тех же 10000000 - оба суммарных значения бегают между 0.60 и 1.3 с (сборщик мусора шалит). Так что можно считать полное отсутствие задержки в обоих случаях. <br />Залипают только фактические значения DateTime.Now.<br /><br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24090/Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тян...2013-02-17T17:23:26Z2013-02-17T17:23:26ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24089/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24087/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.</div></div><br />10000000 запусков в цикле - 1.12 с<br />Можно считать, нет погрешности.<br /></div></div><br /><br />Дело в не скорости исполнения, а в том, что в отличие от StopWatch, DateTime.Now - это недетерминированная операция. Тоесть время может быть и практически мгновенным, а может и залипнуть на пару секунд. Это все зависит от текущей загруженности компьютера. StopWatch же гарантирует кол-во тактов, за которое может быть выполнена операция.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24089/Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тян...2013-02-17T17:16:30Z2013-02-17T17:16:30ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24087/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.</div></div><br />10000000 запусков в цикле - 1.12 с<br />Можно считать, нет погрешности.<br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24087/А нет. Это наводки от прекомпиляции. Одинаковый перфоманс. _startDate = DateTime.Now; _timer.Start()...2013-02-17T17:05:36Z2013-02-17T17:05:36ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24081/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">А нет. Это наводки от прекомпиляции.<br />Одинаковый перфоманс.</div></div><br /><br />_startDate = DateTime.Now;<br />_timer.Start();<br /><br />Между определением Now и замером Start может пройти некоторое время. Эта погрешность будет потом тянуться в течении всей жизни приложения.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24081/А нет. Это наводки от прекомпиляции. Одинаковый перфоманс.2013-02-17T16:14:12Z2013-02-17T16:14:12ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruА нет. Это наводки от прекомпиляции.<br />Одинаковый перфоманс.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24080/Я думал, что перфоманс моего вызова будет хуже, но не значительно, но оказалось: На 10000 вызовов - ...2013-02-17T16:09:20Z2013-02-17T16:09:20ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruЯ думал, что перфоманс моего вызова будет хуже, но не значительно, но оказалось:<br />На 10000 вызовов<br />- DateTime.Now + NowOffset = 0.0892 с<br />- LoggingHelper.Now = 0,0002399 сCopyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24078/ Как я написал, целью было изменить LoggingHelper.Now Да, теперь понятно. Интересно, насколько перфо...2013-02-17T15:53:30Z2013-02-17T15:53:30ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24077/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br />Как я написал, целью было изменить LoggingHelper.Now<br /></div></div><br /><br />Да, теперь понятно. Интересно, насколько перфоманс изменился.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24077/А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами. Как я написал, цель...2013-02-17T15:24:04Z2013-02-17T15:24:04ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24076/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами.</div></div><br />Как я написал, целью было изменить<br />LoggingHelper.Now<br />Которое используется практически везде. В частности в логах.<br />Синхронизация времени просто приведена в соответствие с новой логикой вычисления LoggingHelper.Now.<br /><br />Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24076/Это не позволяет видеть время выполнения операций в логе, не запуская лишний раз профайлер. А причем...2013-02-17T15:20:36Z2013-02-17T15:20:36ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24073/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Это не позволяет видеть время выполнения операций в логе, не запуская лишний раз профайлер.</div></div><br /><br />А причем тут лог? Был переделан метод, синхронизирующий время с атомными часами.Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24073/Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд...2013-02-17T15:13:34Z2013-02-17T15:13:34ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ru<div class="quote"><span class="quotetitle">Mikhail Sukhov <a href="https://stocksharp.ru/posts/m/24072/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote">Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд (DateTime.Now имеет точность до наносекунд, другое дело, что его время вычисления дискретно)?</div></div><br />Смысл в реализации Now. Остальное всё - следствия и частности.<br />DateTime.Now при частом вызове просто возвращает прошлые значения. <br />Погрешность DateTime.Now при этом составляет десятки миллисекунд.<br />Это не позволяет видеть время выполнения операций в логе, не запуская лишний раз профайлер.<br />Ну и просто лог выглядит глупо :)Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24072/ var dtNow = _startDate + _timer.Elapsed; NowOffset = new NtpClient().GetLocalTime(TimeZoneInfo.Loca...2013-02-17T15:07:05Z2013-02-17T15:07:05ZMikhail Sukhovhttps://stocksharp.ru/users/201/info@stocksharp.ru<div class="quote"><span class="quotetitle">VassilSanych <a href="https://stocksharp.ru/posts/m/24070/"><img src="https://stocksharp.ru/images/icon_latest_reply.gif" title="Перейти" alt="Перейти" /></a></span><div class="innerquote"><br /><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
var dtNow = _startDate + _timer.Elapsed;
NowOffset = new NtpClient().GetLocalTime(TimeZoneInfo.Local, timeout).Subtract(dtNow);
</pre>
</div></div></div></div><br /><br />Я так понимаю, смысл в том, чтобы повысить точность передаваемого dtNow, а не добавление миллисекунд (DateTime.Now имеет точность до наносекунд, другое дело, что его время вычисления дискретно)?Copyright @ StockSharp Platform LLC 2010 - 2024https://stocksharp.ru/posts/m/24070/Раз уж есть исходники, вот небольшая доработка для тех, кому позарез нужны миллисекунды public stati...2013-02-17T13:48:22Z2013-02-17T13:48:22ZVassilSanychhttps://stocksharp.ru/users/6491/info@stocksharp.ruРаз уж есть исходники, вот небольшая доработка для тех, кому позарез нужны миллисекунды<br /><div class='spoilertitle'><input type='button' value='Показать спойлер' class='btn btn-primary' onclick="toggleSpoiler(this, 'spolier_012c6cb9c9a2415f888d1dcecf1d7c2d');" title='Показать спойлер' /></div><div class='spoilerbox' id='spolier_012c6cb9c9a2415f888d1dcecf1d7c2d' style='display:none'><div class="code"><strong>Код</strong><div class="innercode"><pre class="brush:csharp">
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);
}
.....
</pre>
</div></div></div><br />Критика приветствуетсяCopyright @ StockSharp Platform LLC 2010 - 2024