﻿<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/style.css'?>
<?xml-stylesheet type='text/css' href='https://stocksharp.com/css/bbeditor.css'?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html">Проблемы с производительностью в методе Connector.GetSecurity()</title>
  <id>~/topic/11936/problemy-s-proizvoditelnostyu-v-metode-connector_getsecurity()/</id>
  <rights type="text">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  <updated>2026-04-29T23:06:32Z</updated>
  <logo>https://stocksharp.com/images/logo.png</logo>
  <link href="https://stocksharp.com/handlers/atom.ashx?category=topic&amp;id=11936" rel="self" type="application/rss+xml" />
  <entry>
    <id>https://stocksharp.com/posts/m/50660/</id>
    <title type="text">Спасибо за фикс. Однако, если я правильно понимаю, проблема все еще сохранилась (хоть и в более мягк...</title>
    <published>2020-06-10T17:49:25Z</published>
    <updated>2020-06-10T17:49:25Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/99075/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">Спасибо за фикс. Однако, если я правильно понимаю, проблема все еще сохранилась (хоть и в более мягком виде) в случае использования HistoryEmulationConnector, т.к. он использует CollectionSecurityProvider, в котором метод LookupById() использует перебор коллекции. В случае одновременного тестирования на истории нескольких инструментов это все так же будет приводить к перебору коллекции инструментов на каждом входящем тике. Это будет работать существенно медленнее, чем было раньше.&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
  <entry>
    <id>https://stocksharp.com/posts/m/50652/</id>
    <title type="text">В последних коммитах была внесена серьезная проблема с производительностью в методе Connector.GetSec...</title>
    <published>2020-06-09T19:05:29Z</published>
    <updated>2020-06-09T19:05:29Z</updated>
    <author>
      <name>Alexander</name>
      <uri>https://stocksharp.com/users/99075/</uri>
      <email>info@stocksharp.com</email>
    </author>
    <content type="html">В последних коммитах была внесена серьезная проблема с производительностью в методе Connector.GetSecurity(). Ранее там использовался entityCache, который позволял быстро получить Security по идентификатору. Теперь там идет использование цепочки методов: TraderHelper.GetOrCreate() -&amp;gt; TraderHelper.LookupById() -&amp;gt; InMemorySecurityStorage.Lookup() -&amp;gt; TraderHelper.Filter() -&amp;gt; Messages.Extensions.Filter()&lt;br /&gt;&lt;br /&gt;Метод TraderHelper.LookupById() хоть и должен вернуть только один единственный объект, вызывает все равно метод InMemorySecurityStorage.Lookup(), который работает с коллекцией Security.&lt;br /&gt;Метод InMemorySecurityStorage.Lookup() является более универсальным и работает с коллекцией, он всегда вынужден перебирать коллекцию, проверяя критерий на каждом Security. Он вызывает метод TraderHelper.Filter() на всей коллекции сохраненных Security.&lt;br /&gt;Метод TraderHelper.Filter() вызывает сначала преобразование коллекции securities в Dictionary с ключами типа SecurityMessage, что вызывает перебор всей коллекции с достаточно тяжелым кодом конверсии Security -&amp;gt; SecurityMessage, а затем вызывает на ключах этого словаря метод Messages.Extensions.Filter().&lt;br /&gt;Метод Messages.Extensions.Filter() снова перебирает всю коллекцию, но на этот раз сообщений SecurityMessage, только что созданных из Security.&lt;br /&gt;&lt;br /&gt;Изначальный метод Connector.GetSecurity() вызывается на каждом входящем сообщении из коннектора.&lt;br /&gt;&lt;br /&gt;Таким образом имеем следующее.&lt;br /&gt;Допустим, что у нас есть очередь из 1000000 входящих сообщений (загрузка тиковой истории) и всего в коннектор загружено у нас 100 инструментов. На каждом входящем сообщении мы имеем два перебора коллекции securities с достаточно тяжелым кодом, выполняющемся на каждом переборе, т.е. у нас получается 1000000 * 200 переборов элементов securities. Каждый перебор - это достаточно тяжелый код по созданию словаря и конверсии всех элементов, а также по вызову сборки мусора, т.к. создется очень много временных объектов нулевого поколения. Чем больше занружено инструментов, тем медленнее (мультипликативно!) это будет работать. ВременнАя сложность текущего кода получается: 1000000 * 200 * X, где X - время, которое тратится на один элемент.&lt;br /&gt;&lt;br /&gt;Совершенно очевидно, что это должно работать с константной сложностью с использованием кэша, как и было ранее. ВременнА сложность такого кода будет 1000000 * Y, где Y - это очень маленькое константное время выборки из кэша. Величина Y много меньше, чем X. По опыту могу казать, что разница тут будет в разы.&lt;br /&gt;&lt;br /&gt;Т.е. текущий код работает минимум в 200 раз медленнее, но более вероятно, что где-то в 1000-2000 раз медленнее, чем должен, на 100 инструментах. При этом чем больше инструментов будет, тем более медленно он будет работать, т.е. имеем полиномиальную сложность времени исполнения.&lt;br /&gt;&lt;br /&gt;Если мой анализ не убедил, то просто попробуйте заказать тики с начала сессии в квике, запустив код где-то в конце дня, чтобы накопилось достаточное количество тиков, и увидите все это в динамике.&lt;br /&gt;</content>
    <rights type="html">Copyright @ StockSharp Platform LLC 2010 - 2025</rights>
  </entry>
</feed>