Обсуждение профилировщика

 

Вот профилировщик все улучшают и улучшают. А как им пользоваться? не понятно. Да, я понимаю, что чем больше процентов тем медленнее. Но это все что я понял. В старом было понятно почему та или иная функция тормозит. Либо она очень тяжелая, либо вызывается часто. Соответственно искал методы облегчения и уменьшение количества вызовов. И должен сказать не безуспешно. Многие коды после оптимизации стали работать в разы быстрее. А некоторые и в десятки раз. 
Сейчас вот совсем непонятно, насколько и как можно получить выигрыш в скорости тестирования. 

Непонятны так же назначения колонок профилировщика Собственная активность ЦП и Общая активность ЦП это что вообще ? 

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

 
Dmitiry Ananiev:

Вот профилировщик все улучшают и улучшают. А как им пользоваться? не понятно. Да, я понимаю, что чем больше процентов тем медленнее. Но это все что я понял. В старом было понятно почему та или иная функция тормозит. Либо она очень тяжелая, либо вызывается часто. Соответственно искал методы облегчения и уменьшение количества вызовов. И должен сказать не безуспешно. Многие коды после оптимизации стали работать в разы быстрее. А некоторые и в десятки раз. 
Сейчас вот совсем непонятно, насколько и как можно получить выигрыш в скорости тестирования. 

Непонятны так же назначения колонок профилировщика Собственная активность ЦП и Общая активность ЦП это что вообще ? 

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

Поддерживаю. Мануал иди статья очень пригодилась бы. Мне тоже кажется что я использую профилировщик на 5% от его функционала

 
Vladimir Gribachev:

Поддерживаю. Мануал иди статья очень пригодилась бы. Мне тоже кажется что я использую профилировщик на 5% от его функционала

Присоединяюсь! Метод научного тыка хочется минимизировать)

 

Поддерживаю.

Было бы не плохо еще иметь некую единицу идеал относительно которой считается результат работы.

 
Старый профилировщик фактически был бесполезен, так как работал в режиме инструментации отладочной версии скомпилированной программы.

Он замедлял за счет инструментации(внедрения кода замера в каждую строку) и вообще замерял абсолютно неоптимизированный код.

Новый работает по полностью оптимизированному коду и не оказывает влияния на его производительность.

Особенностью оптимизированного кода является тотальный инлайнинг подавляющего(почти всех) функций, что превращает результирующий код в портянку из нескольких функций.

Это означает, что большинство функций растворяются и перемешиваются(для компилятора приоритет в максимальной скорости, а не в разграничении участков кода) между собой до такой степени, что уже сложно обнаружить вклад каждой из них.

Но мы, конечно, обнаруживаем. В этом отношении все сделано по уму. С учетом вышесказанного.

Рекомендую внимательно разбираться с отчетами, переключаясь в контекстном меню между вариантами отображений и раскрывая вложения.

Статья напрашивается, но пока можете почитать общие статьи про профилировку С++ программ. Мы специально пошли по пути функционала Visual Studio.

 

Dmitiry Ananiev:

...

Непонятны так же назначения колонок профилировщика Собственная активность ЦП и Общая активность ЦП это что вообще ? 

...

Собственная активность ЦП - условные единицы сложности кода, чем больше значение, тем сложнее/медленнее код, именно этот счётчик критически важен для обнаружения 'узких' мест
Общая активность ЦП - условные единицы сложности ветки исполнения (сложность по стеку вызовов)

Условные единицы зависят от производительности системы в целом (CPU, память, жёсткий диск, сеть), их стоит рассматривать как общая статистическая информация по всей MQL программе в целом.
Сложность программы всегда принимается за 100%, по доле в общей активности ЦП можно отследить ветку программы (функции по стеку вызовов) занимающую большее время исполнения, по собственной активности ЦП - отдельные 'узкие' части программы.

Как уже упоминалось, новый профилировщик работает с полностью оптимизированным кодом MQL программы (агрессивный инлайнинг, регистровые оптимизации и многое другое), именно тем, который в дальнейшем будет работать в терминале (в 'боевом режиме').
Профилировка такого кода (оптимизированного) возможна только в режиме семплинга, что мы успешно и реализовали.
Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы во время ее выполнения. При профилировании замеряется время выполнения и количество вызовов отдельных функций и строк в коде программы. При помощи этого инструмента программист может найти наиболее медленные участки кода и провести их оптимизацию. Профилирование можно проводить на обычном...
 

ок.
Есть 2 функции определяющие разрешение торговли по часам. Во вложении.

Первая тупо берет текущее время (TimeCurrent) извлекает час и деле сравнивает час с началом торговли в часах и с концом. Получается дорогой TimrCurrent вызывается на каждом тике.
Вторая функция определяет новый часовой бар начался или нет. Если да, то дальше как в первом. 

Пишем простой тестовый робот: 


#include <TradeHour.mqh>
#include <TradeHour1.mqh>

void OnTick(void)
  {
    bool x = TradeHour(12,0,23,0);
    bool y = TradeHour1(12,0,23,0);
  }

и запускаем профилировщик. Получаем вот такой результат. 

И теперь скажите какой TradeHour быстрее будет работать при оптимизации? 
что можно усовершенствовать в обоих функциях 

Файлы:
 
Dmitiry Ananiev:

какой TradeHour быстрее будет работать при оптимизации? 

что можно усовершенствовать в обоих функциях 

Задача свести к минимуму количество вычислений. Для этого надо прекратить что-либо передавать в эту функцию. Использовать в ней static const переменную из input-значений советника.

В Тестере TimeCurrent и получение времени текущего бара, скорее всего, работают одинаково быстро (если не так, то это кривая реализация). Поэтому если в своей функции сделать минимум вычислений, то будет неважно, через какой штатный механизм идет получение текущего времени. Т.е. использовать всякие IsNewBar() на каком-нибудь H1 смысла иметь не будет.


ЗЫ Основные тормоза в Тестере - это другие вычисления.

 

2724

До сих пор профилировщик работает не всегда. Иногда крашит окно визуального тестера в конце теста вместо выдачи результатов.
Нужны данные для воспроизведения? Будет этим кто-то заниматься?

 

Предложение: при повторном запуске профилирования, если исходник не менялся, не делать перекомпиляцию. Очень долгая она для релиза/профилирования...

Будет удобно, если нужно провести профилирование с другими параметрами или за другой интервал дат.