Тормоза
Atom Reply
10/28/2015


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

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

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



Thanks:




13 Answers
eugene20237

Avatar
Date: 10/29/2015
Reply


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

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 10/31/2015
Reply


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


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

Vitaly48

Avatar
Date: 11/2/2015
Reply


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

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

Avatar
Programmer
Date: 11/2/2015
Reply


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

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 11/2/2015
Reply


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


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

Vitaly48

Avatar
Date: 11/3/2015
Reply


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


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

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

Mikhail Sukhov

Avatar
Articles author Programmer Trader
Date: 11/3/2015
Reply


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


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

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

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

Avatar
Programmer
Date: 11/3/2015
Reply


Отправляем каждую свечку для прорисовки по отдельности:
Код
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}})));

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

Vitaly48

Avatar
Date: 11/3/2015
Reply


Валентин Лебедев Перейти
Отправляем каждую свечку для прорисовки по отдельности:
Код
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}})));

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


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


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

agat50

Avatar
Programmer
Date: 5/26/2016
Reply


Тоже столкнулся, на исторических данных свечка с индюком могла рисоваться секунду. Профайлер показал множественные затыки на 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) тоже переделывал, разницы нет.
Thanks:

agat50

Avatar
Programmer
Date: 5/26/2016
Reply


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

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

http://s020.radikal.ru/i...605/e4/83932c189c41.png
http://s017.radikal.ru/i...605/03/11f5d742b0e8.png

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

Иван З.

Avatar
Training Articles author Donator
Date: 5/27/2016
Reply


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

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

https://s020.radikal.ru/i...605/e4/83932c189c41.png
https://s017.radikal.ru/i...605/03/11f5d742b0e8.png

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


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

Thanks:

agat50

Avatar
Programmer
Date: 5/30/2016
Reply


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


Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy