Canvas vs Labels - страница 13

 
Nikolai Semko:

а, ну тогда это вообще норм.
У меня же тоже на гифке один канвас это панелька, и она меньше всего ресурсов отъедает, так как ее не нужно так часто перерисовывать и ловить момент прихода нового бара.

Супер! Все летает!

А на низкой скорости обновляется без пропусков.
 
Dmitry Fedoseev:
Нашел правильные файлы. Где какие цифры, куда и когда на них смотреть - непонятно, но и и без этого невооруженным взглядом видно, что канвас значительно тормознутее, притом что используется не просто канвас вместо одной леблы, а один канвас вместо кучи лейблов.

Запускаем эксперт CanvasVsLabels.mq5, выбираем, тип дисплея outType, включаем limit_fps, устанавливаем, nIterations, он по умолчанию равен 10000. Этого достаточно, можно не менять. Тогда результаты будут схожи с представленными здесь: https://www.mql5.com/ru/forum/364640/page11#comment_21301589.

Теперь о результатах.  Min delayMid delay и Max delay, это, минимальное, среднее и максимальное, значения задержек за один проход, соответственно. Total, это общее время за все количество nIterations проходов.

Еще раз, привожу таблицу результатов сравнения 

Сanvas unlimited fps Canvas limited fps Labels unlimited fps Labels limited fps
Min delay (μs) 1530 1 18 0
Mid delay (μs) 7674 4086 48 7
Max delay (μs) 11967 11093 785 286
Total (μs) 77727510 29452299 39648984 27439654


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

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Canvas vs Labels

fxsaber, 2021.03.13 19:26

ЗЫ Такой результат только у меня?

fxsaber:

Отъедает 15-20%. Видимо, тормозная видеокарта. 

Оказалось, что ResourceReadImage очень медленная. Избавился от нее - стала нулевая нагрузка.

 

Еще раз публикую таблицу сравнения, но уже с гистограммами.

Сanvas unlimited fps Canvas limited fps Labels unlimited fps Labels limited fps
Min delay (μs) 1530 1 18 0
Mid delay (μs) 7674 4086 48 7
Max delay (μs) 11967 11093 785 286
Total (μs) 77727510 29452299 39648984 27439654


Сравнение средних значений задержки за один проход

Mid delay

Которые почему-то оказались несопоставимыми с общим временем работы (Total)...

Сравнение общего времени работы

Total

Замеры показали, что дисплей на основе Canvas с ограниченным FPS (Canvas unlimited FPS) по производительности немного медленнее дисплея на основе Лейблов с ограниченным FPS  (Labels unlimited FPS). Но в целом они оба подходят для вывода информации из высоконагруженных процессов.

Как запустить эксперта для выполнения замеров

Входные параметры

  1. Выбираем outType из выпадающего списка Canvas или Labels
  2. Включаем или отключаем limit_fps
  3. Подтверждаем выбор
  4. Для запуска замеров в чарте нажимаем кнопку Start

Запуск замеров

Точно таким же образом эксперт может делать замеры в визуальном тестере. Только диапазон дат в настройках тестера нужно выставить таким образом, чтобы баров в истории было не меньше, чем значение входного параметра nIterations.

Больше информации, а также исходники можно найти в описание библиотеки Chart Display: https://www.mql5.com/ru/code/33898

Библиотека специально модифицированная для замеров: https://www.mql5.com/ru/code/download/33898/chartdisplay.mqh

Универсальный эксперт для выполнения замеров: https://www.mql5.com/ru/code/download/33898/canvasvslabels.mq5

Более подробно смотрите в КБ:  https://www.mql5.com/ru/code/33898


Хотелось бы добавить более корректные замеры, сделанные с помощью нового эксперта в самое первое сообщение данной темы. Поскольку те замеры, что есть там на данный момент, некорректны. Но первое сообщение, к сожалению, уже отредактировать нельзя. Прошу модераторов добавить более корректные замеры в начало, а те что там сейчас есть оформить как неактуальные.

Дисплей с оптимизацией для вывода текста в чарт по типу консоли
Дисплей с оптимизацией для вывода текста в чарт по типу консоли
  • www.mql5.com
Данная библиотека позволяет создавать дисплеи для удобного вывода текстовой информации в чарт с наиболее оптимальной скоростью
 
fxsaber:

Оказалось, что ResourceReadImage очень медленная. Избавился от нее - стала нулевая нагрузка.

Серьёзно? 
Сюрприз для меня.
Насколько медленнее, чем копирование обычного uint массива того же размера?
 
Mihail Matkovskij:

Запускаем эксперт CanvasVsLabels.mq5...

А смысл? Прям сейчас не охота копаться в кода. Как вычисляются эти показатели? Если уж так тестировать в тестере, то надо мерить общее время, затраченное на прогон и больше ничего, а не работу отдельных участков кода замерять. В крайнем случае инит не считать. И вот, без измерений видно, что канвас медленнее работает. Не знаю, может у меня аномалия какая... 

 
Nikolai Semko:
Серьёзно? 
Сюрприз для меня.
Насколько медленнее, чем копирование обычного uint массива того же размера?

С вызовом было где-то 15% нагрузка, без - нулевая.

 
Dmitry Fedoseev:

А смысл? Прям сейчас не охота копаться в кода. Как вычисляются эти показатели? Если уж так тестировать в тестере, то надо мерить общее время, затраченное на прогон и больше ничего, а не работу отдельных участков кода замерять. В крайнем случае инит не считать. И вот, без измерений видно, что канвас медленнее работает. Не знаю, может у меня аномалия какая... 

В коде копаться не охота. И поверить на слово тоже нет желания. :) Я прям не знаю, как вам объяснять. Рассказывать от начала до конца, как я писал весь код... Так это будет целая статья. :)

А в том, как эксперт делает замеры вообще нечего разбираться.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void run() {
  MqlRates rates[];
  int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
  ulong start, min, mid, max;
  ulong last, delay; 
  static ulong totalDelays = 0;
  static int nTick = 0;
  ulong first;
  if (!triggerBtn.State())
    return;
  start = GetMicrosecondCount();
  min = INT_MAX; mid = 0; max = 0;
  if (CopyRates(NULL, PERIOD_CURRENT, 0, nIterations, rates) != nIterations) {
    triggerBtn.State(false);
    triggerBtn.setText("Start");
    Print("Not enough quotes!");
    Comment("Not enough quotes!");
    return;
  }
  for (int i = nIterations - 1; i >= 0 && triggerBtn.State(); i--) {
    first = GetMicrosecondCount();
    
    display.push();
    display.setText(concatenate(i));
    display.update();
    
    last = GetMicrosecondCount();
    delay = last - first;
    if (delay < min)
      min = delay;
    if (delay > max)
      max = delay;
    nTick++;
    totalDelays += delay;
    mid = totalDelays / nTick;
    Comment("Min delay: " + (string)min + " μs\n"
            "Mid delay: " + (string)mid + " μs\n"
            "Max delay: " + (string)max + " μs\n"
            "Total: " + (string)(GetMicrosecondCount() - start) + " μs" + " \n"
            "Completed: " + (string)(int)(100.0 / nIterations * (nIterations - i)) + "%");
  }
  
  printf("Min delay: %d μs", min);
  printf("Mid delay: %d μs", mid);
  printf("Max delay: %d μs", max);
  printf("Total: %d μs", GetMicrosecondCount() - start);
  triggerBtn.State(false);
  triggerBtn.setText("Start");
  ChartRedraw();
}
Total вычисляется по окончанию цикла, а  min, mid и max в теле цикла, после  display.push, display.setText и display.update. Ничего сложного, если посидеть и хорошенько всё рассмотреть, то можно добраться хоть до исходников Канваса и Лейблов. Там, кстати, тоже ничего сложного нет. Разве только за исключением методов, рисующих кривые Безье и им подобных, в Канвасе.
 
Dmitry Fedoseev:

И вот, без измерений видно, что канвас медленнее работает. Не знаю, может у меня аномалия какая... 

При этом нужно сказать, при каких входных параметрах Канвас медленный. Если limit_fps: false, то тогда понятно "и к гадалке не ходи"... :) 

 
fxsaber:

Оказалось, что ResourceReadImage очень медленная. Избавился от нее - стала нулевая нагрузка.

Если читаете из сохраненного во время компиляции ресурса, то это надо делать однократно.

Ресурсы при компиляции сжимаются.