Canvas vs Labels

 

Представляю вниманию форумчан сравнение скорости работы дисплеев для вывода текста в чарт, созданных разными способами. Первый вариант дисплея я сделал с использованием класса CCanvas, второй вариант создал на лейблах (CChartObjectLabel). Все классы были взяты из стандартной библиотеки. Данная идея посетила меня, когда я создал дисплей на CCanvas и он существенно замедлял моего эксперта. В тоже время, некоторые программисты утверждали, что я ошибаюсь и CCanvas, а если быть точным, то OBJ_BITMAP_LABEL работает очень быстро, быстрее всех способов вывода информации в чарт, доступных в MetaTrader. Поэтому, я решил проверить это экспериментальным путем. Итак, момент истины.

Работа дисплея с выводом в CCanvas

СCanvas

Нагрузка на CPU при этом

CPU

Работа дисплея с выводом в CChartObjectLabel

Labels

Работа дисплея с выводом в CChartObjectLabel с включенным режимом оптимизации скорости работы (об этом расскажу ниже)

Labels Optimized

Теперь о значениях времени. Total, это общее время работы данного тестового эксперта. Min delay, Mid delay и Max delay - это периоды задержки на тиках. Но их почему-то не всегда удается корректно получить, хотя код проверял, ошибок нет. Думаю, всё дело в работе функции GetTickCount64 в тестере... Но это несущественная проблема. Главное, что общее время показывает.

Теперь расскажу коротко об оптимизации работы дисплея на лейблах. Дело в том, что чтобы текст появился на экране нужно вывести строки из специального массива строк в лейблы, которые расположены сверху вниз в количестве 50 штук. Но когда обновляется только последняя строка, то нет необходимости обновлять все лейблы, достаточно обновить только один лейбл, который соответствует этой строке. Включаем режим оптимизации (optimizeUpdate) и получаем прирост производительности более чем в 2 раза.

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

Без оптимизации optimizeUpdate: false

optimizeUpdate: false

С оптимизацией optimizeUpdate: true

optimizeUpdate: true

Добавил все результаты в Exscel

comparizon-of-results

На первой гистограмме общее сравнение, на второй только вариант с лейблами.

Вывод: дисплей, созданный на CChartObjectLabel  может работать быстрее в 83,7 раза, чем аналогичный на CCanvas. Не зря операции над пикселями принято считать наиболее затратными во всех программах!

Прилагаю таблицу с результатами тестирования. Исходники можно скачать в КБ: https://www.mql5.com/ru/code/33898


Файлы:
 

Не понимаю, почему сравнение было в Визуализаторе, а не в Терминале?

В код не всматривался. Для таких задач Канвас делается один на все "50 строк".


В Терминале замерил через Usage-библу. Существенной разницы методы не показывают.

 
fxsaber:

Не понимаю, почему сравнение было в Визуализаторе, а не в Терминале?

Потому, что в Визуализаторе как раз и возникают проблемы с медленной скоростью Канваса. И Вы можете видеть, какие. Такой дисплей съедает больше 50% времени CPU, я об этом говорил выше! А в Терминале нужно было бы вызывать методы в цикле, чтобы всё увидеть. Но я не стал над этим заморачиваться. У меня в цикле работает эксперт с автономной оптимизацией, где, собственно и нужен такой дисплей с быстрым обновлением. Но сейчас я пока не готов его представить, так как проект еще не завершен.


fxsaber:

В код не всматривался. Для таких задач Канвас делается один на все "50 строк".

Тогда посмотрите. Он там один!

 
Вводите народ в заблуждение.
Очень хочется мне нос утереть, да? 
Я так и знал, что захотите что-то подобное сбацать. И знал, что будет подобная ЛАЖА. 

Не умеете вы готовить сравнительные тесты. 

 
Mihail Matkovskij:

Потому, что в Визуализаторе как раз и возникают проблемы с медленной скоростью Канваса. И Вы можете видеть, какие. Такой дисплей съедает больше 50% времени CPU, я об этом говорил выше! А в Терминале нужно было бы вызывать методы в цикле, чтобы всё увидеть. Но я не стал над этим заморачиваться. У меня в цикле работает эксперт с автономной оптимизацией, где, собственно и нужен такой дисплей с быстрым обновлением. Но сейчас я пока не готов его представить, так как проект еще не завершен.


Тогда посмотрите. Он там один!

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

Постараюсь вам не мешать… создавайте отдельные лейблы для каждой буквы… и так-же отдельный ресурс…

 
Nikolai Semko:
Вводите народ в заблуждение.
Очень хочется мне нос утереть, да? 
Я так и знал, что захотите что-то подобное сбацать. И знал, что будет подобная ЛАЖА. 

Не умеете вы готовить сравнительные тесты. 

Всё что я понял из Вашего поста, это слова "заблуждение", "ЛАЖА", "не умею готовить тесты". Правда, не понял, как они относятся к данной теме... Остальное, не понимаю от слова "совсем"! Когда я создавал данную тему, то хотел видеть здесь конструктивную критику, а не кучу непонятных претензий! Так что, потрудитесь объяснить свои слова. В противном случае, не пишите здесь ерунду!

 
Alexey Viktorov:

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

Постараюсь вам не мешать… создавайте отдельные лейблы для каждой буквы… и так-же отдельный ресурс…

Спешу сообщить вам, Алексей. Вы, конечно, склонны фантазировать, как и Николай... Но на самом деле всё не так как вы себе представляете. Просто, для разных задач нужны разные варианты решений. У вас и Николая будут замечания по существу?!

 
Mihail Matkovskij:

Всё что я понял из Вашего поста, это слова "заблуждение", "ЛАЖА", "не умею готовить тесты". Правда, не понял, как они относятся к данной теме... Остальное, не понимаю от слова "совсем"! Когда я создавал данную тему, то хотел видеть здесь конструктивную критику, а не кучу непонятных претензий! Так что, потрудитесь объяснить свои слова. В противном случае, не пишите здесь ерунду!

Терпение, мой друг, терпение. 
У меня нет столько времени, как у Вас. У меня сейчас последний семестр и параллельно три групповых проекта. Поэтому я здесь в импульсном режиме.
Но, Ок, я Вас смогу убедить в том, что Вы заблуждаетесь, только расслабтесь и не напрягайтесь так.  Иначе усилия мои будут тщетны. 
Если, конечно, Ваш разум умеет подчинять ваши эмоции.
 
Nikolai Semko:
Терпение, мой друг, терпение. 
У меня нет столько времени, как у Вас. У меня сейчас последний семестр и параллельно три групповых проекта. Поэтому я здесь в импульсном режиме.
Но, Ок, я Вас смогу убедить в Вашем заблуждении, только расслабтесь и не напрягайтесь так.  Иначе усилия мои будут тщетны. 

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

 

Не понял. На первом изображении есть канвас, и на нём есть текст.

На последующих изображениях нет аналогичного текста на графике.

Т.е., а что  тогда сравнивалось?

 
Mihail Matkovskij:

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

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