Тормоза
Atom
10/29/2015


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

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

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



Thanks:


1 2  >
eugene20237

Avatar
Date: 10/29/2015
Reply


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

Mikhail Sukhov

Avatar
Date: 10/31/2015
Reply


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


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

Vitaly48

Avatar
Date: 11/2/2015
Reply


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

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

Avatar
Date: 11/2/2015
Reply


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

Mikhail Sukhov

Avatar
Date: 11/3/2015
Reply


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


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

Vitaly48

Avatar
Date: 11/3/2015
Reply


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


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

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

Mikhail Sukhov

Avatar
Date: 11/3/2015
Reply


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


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

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

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

Avatar
Date: 11/3/2015
Reply


Отправляем каждую свечку для прорисовки по отдельности:
Code
foreach (var candle in candles)
{
    chart.Draw(candleElement, candle);
}

Отправляем все свечки на прорисовку разом:
Code
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/4/2015
Reply


Валентин Лебедев Go to
Отправляем каждую свечку для прорисовки по отдельности:
Code
foreach (var candle in candles)
{
    chart.Draw(candleElement, candle);
}

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

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


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


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

agat50

Avatar
Date: 5/26/2016
Reply


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

Было:

Quote:

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

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


Стало:

Quote:

_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.

Quote:

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:
1 2  >

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

loading
clippy