Справка по MetaEditorРазработка программПрофилирование кода

Профилирование кода

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

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

Многие программы, в особенности индикаторы, осуществляют какие-либо расчеты только при приходе нового тика (OnTick, OnCalculate). Таким образом, для оценки производительности приходится ждать поступления новых тиков в режиме реального времени. Используя профилирование на исторических данных, вы можете сразу давать нужную нагрузку и проверять работу программ даже в выходные дни, когда рынки закрыты.

Как происходит профилирование

Для профилирования используется метод "Sampling". Профилировщик делает паузы в работе MQL-программы (~10 000 раз в секунду) и собирает статистику того, сколько раз пауза пришлась на тот или иной участок кода. В том числе анализируются стеки вызовов, чтобы определить "вклад" каждой функции в общее время работы кода. В конце профилирования вы получаете информацию о том, сколько раз была выполнена пауза и сколько раз каждая из функций оказывалась в стеке вызовов:

  • Общая активность ЦП [единица измерения, %] — общее количество "появления" функции в стеке вызовов.
  • Собственная активность ЦП [единица измерения, %] — количество "пауз", которые произошли непосредственно внутри указанной функции. Этот счетчик наиболее важен для определения "узких" мест, поскольку по статистике остановка чаще происходит в тех участках программы, которые требуют большего процессорного времени.

Sampling — это легковесный и точный метод. В отличие от других, он не вносит никаких изменений в анализируемый код, которые могли бы повлиять на скорость его работы.

Настройки профилирования

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

Отладка

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

Опция отключает только явный инлайнинг. Функции, неявно сгенерированные компилятором, могут остаться. В отчете они будут отображаться с префиксом [inlined].

Чтобы увеличить объем детализации отчета о профилировании, можно отключать режим оптимизации кода. Без оптимизации скорость кода может упасть кратно, но взамен можно увидеть более обширное покрытие кода. При использовании учитывайте, что узкие места кода будут неточными.

Возможность управления оптимизацией кода есть также в настройках проектов.

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

Запуск профилирования #

Откройте файл исходного кода программы (MQ4 или MQ5). В меню "Отладка" или на панели инструментов "Стандартная" нажмите "Начать профилирование на реальных данных Начать профилирование на реальных данных" или "Начать профилирование на исторических данных Начать профилирование на исторических данных".

После этого автоматически будет скомпилирована специальная версия программы для профилирования. В зависимости от выбранного типа профилирования программа будет запущена на обычном графике в торговой платформе или в тестере стратегий.

Запуск профилирования на графике в торговой платформе

  • По умолчанию, приложение запускается на графике EURUSD H1. Для запуска на другом символе и периоде, укажите их на вкладке "Отладка" в настройках MetaEditor.
  • При профилировании на истории всегда используется невизуальный режим тестера. Визуальный режим практически не имеет смысла, поскольку основные ресурсы тратятся на отрисовку, а не расчеты внутри MQL-программы

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

Далее остановите профилирование: удалите программу с графика или нажмите "Завершить профилирование Завершить профилирование" меню "Отладка" или на панели инструментов "Стандартная".

Для получения более точных результатов профилирования рекомендуется вручную удалять программу с графика вместо использования команды "Завершить профилирование Завершить профилирование".

Просмотр результатов профилирования

После завершения профилирования его результаты будут открыты во вкладке "Профилировщик" окна "Инструменты". Также для наглядности результаты отображаются непосредственно в коде — путем подсветки строк с функциями. Чем ярче цвет подсветки, тем больше времени потребовалось для выполнения функции. Так вы можете быстро визуально оценить наиболее узкие места программы.

Отчет профилирования представлен в виде функций или строк программы, для каждой из которых доступно два показателя:

  • Общая активность ЦП [единица измерения, %] — общее количество "появления" функции в стеке вызовов.
  • Собственная активность ЦП [единица измерения, %] — количество "пауз", которые произошли непосредственно внутри указанной функции. Этот счетчик наиболее важен для определения "узких" мест, поскольку по статистике остановка чаще происходит в тех участках программы, которые требуют большего процессорного времени.

Для показателя выводится абсолютное количество и процент от общего количества.

По умолчанию в списке показываются крупные функции, расположенные на верхний уровнях. Для перехода к более мелким, дважды нажмите на строку.

Результаты профилирования

Отчет профилирования можно посмотреть в двух режимах: по вызовам и по строкам. Второй способ позволяет исследовать с максимальной детализацией — находить не только самые медленные функции, но и самые медленные их части. Для переключения между режимами используйте контекстное меню.

Для удобства различные элементы языка MQL отображаются в отчете иконками:

  • Пользовательская функция — пользовательская функция.
  • Системная функция — системная функция.
  • Функция обработки событий — функция обработки событий (On*).
  • Метод класса — метод класса.
  • Защищенный метод класса — защищенный метод класса.

Помимо указанных типов функций, в профилировщике отображаются:

  • Системная функция @global_initializations — информация по инициализации всех глобальных переменных.
  • Системная функция @global_deinitializations — информация по деинициализации всех глобальных переменных.

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

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

Контекстное меню #

В контекстном меню доступны следующие команды:

  • Открыть — перейти к строке или функции в файле исходного кода. Это же действие можно выполнить двойным кликом мышью или нажатием Enter.
  • Развернуть все — развернуть все свернутые функции.
  • Свернуть все —  свернуть все развернутые функции.
  • Функции по строкам — перейти в режим просмотра результатов профилирования по строкам.
  • Функции по вызовам —  перейти в режим просмотра результатов профилирования по вызовам.
  • Экспорт — экспортировать результаты профилирования в формате Open XML (MS Office Excel), HTML (Internet Explorer) или CSV (текстовый файл).
  • Авторазмер — включить/выключить автоматическую установку размеров полей. Это же действие выполняется клавишей "A".
  • Сетка — включить/выключить сетку, разделяющую поля. Это же действие выполняется клавишей "G".