← Назад

Тормоза

Что-то явно не так у вас с движком для графиков. Почему он так безбожно тормозит? И в Studio, и в API, и наверное везде. Когда открываешь вкладку с графиком проходит пару секунд прежде чем он откроется. Перетаскивать график мышью очень противно - запаздывает, тормозит и грузит проц. Вот если через Overview скроллить, то нормально.

Всё это происходит на обычных исторических данных. Загружал 4-часовые свечки по Si с 2009 года, т.е. данных не много там. Никаких CandleManager не использовал. Просто создал свечки сам и отрисовал их. Работаю на десктопе с нормальным железом.

Это SciChart такой тормозной или он так плохо приготовлен? Или может быть я неправильно что делаю... но тогда почему Studio работает точно также...

Комментарии (13)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

eugene20237
eugene20237 Автор

Такое ощущение, что весь интерфейс тормозной у S#. Во всех продуктах. Может из-за каких-то библиотек. Не знаю вобщем 😌

Mikhail Sukhov
Mikhail Sukhov

eugene20237: Такое ощущение, что весь интерфейс тормозной у S#. Во всех продуктах. Может из-за каких-то библиотек. Не знаю вобщем 😌

Может драйвера. Интерфейс на WPF от .NET 4.0 Сравнительно свежая технология. Старые ОС или компьютеры могут не иметь обновления.

Vitaly48
Vitaly48

я когда только начал разбираться, вообще несколько дней думал он у меня не отрисовывается из-за того, что я видел пустой фон диаграммы и закрывал форму, только потом понял, что нужно подождать некоторое время что бы он начал рисовать свечки! а теперь привык, даже прикольно, как будто фильм смотришь, видишь куда в таймфрейме ходили свечки, в каком месте свечи было больше сделок ))

Mikhail Sukhov
Mikhail Sukhov

Vitaly48: я когда только начал разбираться, вообще несколько дней думал он у меня не отрисовывается из-за того, что я видел пустой фон диаграммы и закрывал форму, только потом понял, что нужно подождать некоторое время что бы он начал рисовать свечки! а теперь привык, даже прикольно, как будто фильм смотришь, видишь куда в таймфрейме ходили свечки, в каком месте свечи было больше сделок ))

Не путайте процесс передачи данных и скроллинг. Автор, если не врет, заявляет о торможении всех компонентов. В том числе и тех, которые к графику и свечам не имеют отношения. Такое может быть только в случае или морально устаревшего железа или отсутствия драйверов.

Валентин Лебедев
Валентин Лебедев

Попробуй вызывать Draw не для каждой отдельной свечи, а передать в него все свечи сразу, одной коллекцией. Была подобная проблема, решил именно таким образом, теперь рисует быстро.

Vitaly48
Vitaly48

Валентин Лебедев: Попробуй вызывать Draw не для каждой отдельной свечи, а передать в него все свечи сразу, одной коллекцией. Была подобная проблема, решил именно таким образом, теперь рисует быстро.

Валентин, а Вы не могли бы пояснить, а лучше кинуть примерчик ) как Вы в Draw передаете не одну, а все свечи сразу? спасибо!

Mikhail Sukhov Михаил, к компонентам претензий ни каких нет, все работает четко, за месяц знакомств с ними не было ни каких глюков или крашей, тьфу-тьфу-тьфу ) все работает как часы, немного напрягают моменты в плане избыточной накрученности, мне бы лично хватило бы и десятой части, если не сотой, того функционала, что представлен в этой библиотеке!

Mikhail Sukhov
Mikhail Sukhov

Vitaly48: Михаил, к компонентам претензий ни каких нет, все работает четко

Дело не в том, есть у вас претензии или нет. А в том, что вы в одном топике мешаете разные темы. И путаете потеницально тех, кто будет читать спустя какое то время.

Не надо писать в топики по принципу ключевых слов.

Валентин Лебедев
Валентин Лебедев

Отправляем каждую свечку для прорисовки по отдельности:

foreach (var candle in candles)
{
    chart.Draw(candleElement, candle);
}

Отправляем все свечки на прорисовку разом:

chart.Draw(
    candles.Select(
        candle =>
            new RefPair<DateTimeOffset, IDictionary<IChartElement, object>>(candle.OpenTime,
                new Dictionary<IChartElement, object> {{candleElement, candle}})));

Второй вариант работает гораздо быстрее.

Vitaly48
Vitaly48
Vitaly48

Валентин Лебедев: Отправляем каждую свечку для прорисовки по отдельности:

foreach (var candle in candles) { chart.Draw(candleElement, candle); }

> Отправляем все свечки на прорисовку разом:
> ```csharp
chart.Draw(
    candles.Select(
        candle =>
            new RefPair<DateTimeOffset, IDictionary<IChartElement, object>>(candle.OpenTime,
                new Dictionary<IChartElement, object> {{candleElement, candle}})));

Второй вариант работает гораздо быстрее.

Спасибо, с первым кодом все понятно, но второй... это для меня слишком круто, ух, буду разбираться )) но все равно спасибо еще раз!

Mikhail Sukhov Да, я понял, сори за офтоп, такое больше не повториться!

agat50
agat50

Тоже столкнулся, на исторических данных свечка с индюком могла рисоваться секунду. Профайлер показал множественные затыки на Monitor.Enter внутри стокшарпа. Решил переделкой на async void:

Было:

_candleManager = new CandleManager(_smartTrader); _candleManager.Processing += CandleManagerOnProcessing;

private void CandleManagerOnProcessing(CandleSeries candleSeries, Candle candle) { //... }

Стало:

_candleManager = new CandleManager(_smartTrader); _candleManager.Processing += CandleManagerOnProcessing; private readonly SemaphoreSlim _candleManagerOnProcessingSyncRoot = new SemaphoreSlim(1); private async void CandleManagerOnProcessing(CandleSeries candleSeries, Candle candle) { await _candleManagerOnProcessingSyncRoot.WaitAsync(); try { //... } catch (Exception e) { _logManager.Application.AddErrorLog(e); } finally { _candleManagerOnProcessingSyncRoot.Release(); } }

Стало рисовать сильно быстрее и равномерно.

P.S.

private readonly SemaphoreSlim _candleManagerOnProcessingSyncRoot = new SemaphoreSlim(1); private readonly ConcurrentQueue<Tuple<CandleSeries, Candle>> _candlesQueue = new ConcurrentQueue<Tuple<CandleSeries, Candle>>();

private void CandleManagerOnProcessing(CandleSeries candleSeries, Candle candle) { _candlesQueue.Enqueue(Tuple.Create(candleSeries, candle)); ProcessCandleQueue(); }

private async void ProcessCandleQueue() { await _candleManagerOnProcessingSyncRoot.WaitAsync(); try { Tuple<CandleSeries, Candle> n; while (_candlesQueue.TryDequeue(out n)) { var candleSeries = n.Item1; var candle = n.Item2;

Или так, ещё шустрее.

P.P.S А, нет, всё-равно тормозит иногда (и начинает жрать память при этом (1.5гб на минутный график за 5 дней, и это не _candlesQueue), причём непонятно от чего зависит - иногда пролетает мгновенно, иногда нет... На Draw(IEnumerable<RefPair) тоже переделывал, разницы нет.

agat50
agat50

А память течёт из-за WPF Xceed компонентов кажется...

Кто-нибудь сталкивался?

http://s020.radikal.ru/i719/1605/e4/83932c189c41.png http://s017.radikal.ru/i400/1605/03/11f5d742b0e8.png

На 1.5гб вывалилось по оутофмемори в конце концов (несколько сотен свечей максимум), хотя обычно за 200-250мб на любом количестве свечей не вылезает и рисует нормально.

Иван З.
Иван З.

agat50: А память течёт из-за WPF Xceed компонентов кажется...

Кто-нибудь сталкивался?

http://s020.radikal.ru/i719/1605/e4/83932c189c41.png http://s017.radikal.ru/i400/1605/03/11f5d742b0e8.png

На 1.5гб вывалилось по оутофмемори в конце концов (несколько сотен свечей максимум), хотя обычно за 200-250мб на любом количестве свечей не вылезает и рисует нормально.

В одной программе PropertyGrid от WPF Xceed бесплатого, очень сильно память поджирали. Правда давно это было.

agat50
agat50

Поставил дополнительных задержек для хорошего наполнения очереди, намертво прибил х86 - вроде прошло.