Профилирование — это сбор характеристик программы во время ее выполнения. При профилировании замеряется время выполнения и количество вызовов отдельных функций и строк в коде программы. При помощи этого инструмента программист может найти наиболее медленные участки кода и провести их оптимизацию.
Профилирование можно проводить на обычном графике в торговой платформе, а также на исторических данных при помощи тестера стратегий. В первом случае программа будет запущена на графике, который обновляется в режиме реального времени. Вы сможете проверить, как поведет себя программа в реальных условиях использования. Во втором случае, программа будет запущена в тестере стратегий в визуальном режиме. Преимущество этого способа в том, что вам не потребуется ждать поступления реальных данных с торгового сервера или наступления определенных торговых условий.
Многие программы, в особенности индикаторы, осуществляют какие-либо расчеты только при приходе нового тика (OnTick, OnCalculate). Таким образом, для оценки производительности приходится ждать поступления новых тиков в режиме реального времени. Используя профилирование на исторических данных, вы можете сразу давать нужную нагрузку и проверять работу программ даже в выходные дни, когда рынки закрыты.
Для профилирования используется метод "Sampling". Профилировщик делает паузы в работе MQL-программы (~10 000 раз в секунду) и собирает статистику того, сколько раз пауза пришлась на тот или иной участок кода. В том числе анализируются стеки вызовов, чтобы определить "вклад" каждой функции в общее время работы кода. В конце профилирования вы получаете информацию о том, сколько раз была выполнена пауза и сколько раз каждая из функций оказывалась в стеке вызовов:
Sampling — это легковесный и точный метод. В отличие от других, он не вносит никаких изменений в анализируемый код, которые могли бы повлиять на скорость его работы.
По умолчанию профилируемая программа запускается на текущем открытом графике в торговой платформе. В случае профилирования на исторических данных, используются текущие настройки тестера стратегий. В настройках MetaEditor вы можете задать любой другой график и переопределить некоторые настройки тестирования.
Здесь же можно включить или отключить инлайнинг (встраивание) функций при компиляции. При инлайнинге код функций помещается непосредственно в место их вызова, что позволяет добиться существенного ускорения при работе программы. Однако это затрудняет профилирование функций. Чтобы получить отчет по "чистым" функциям, вы можете отключить инлайнинг.
Опция отключает только явный инлайнинг. Функции, неявно сгенерированные компилятором, могут остаться. В отчете они будут отображаться с префиксом [inlined].
Чтобы увеличить объем детализации отчета о профилировании, можно отключать режим оптимизации кода. Без оптимизации скорость кода может упасть кратно, но взамен можно увидеть более обширное покрытие кода. При использовании учитывайте, что узкие места кода будут неточными.
Возможность управления оптимизацией кода есть также в настройках проектов.
Откройте файл исходного кода программы (MQ4 или MQ5). В меню "Отладка" или на панели инструментов "Стандартная" нажмите " Начать профилирование на реальных данных" или " Начать профилирование на исторических данных".
После этого автоматически будет скомпилирована специальная версия программы для профилирования. В зависимости от выбранного типа профилирования программа будет запущена на обычном графике в торговой платформе или в тестере стратегий.
|
После запуска поработайте некоторое время с приложением, максимально используя все его функции. Это необходимо для того, чтобы профилировщик смог замерить время выполнения всех функций и строк программы.
Далее остановите профилирование: удалите программу с графика или нажмите " Завершить профилирование" меню "Отладка" или на панели инструментов "Стандартная".
Для получения более точных результатов профилирования рекомендуется вручную удалять программу с графика вместо использования команды " Завершить профилирование". |
После завершения профилирования его результаты будут открыты во вкладке "Профилировщик" окна "Инструменты". Также для наглядности результаты отображаются непосредственно в коде — путем подсветки строк с функциями. Чем ярче цвет подсветки, тем больше времени потребовалось для выполнения функции. Так вы можете быстро визуально оценить наиболее узкие места программы.
Отчет профилирования представлен в виде функций или строк программы, для каждой из которых доступно два показателя:
Для показателя выводится абсолютное количество и процент от общего количества.
По умолчанию в списке показываются крупные функции, расположенные на верхний уровнях. Для перехода к более мелким, дважды нажмите на строку.
Отчет профилирования можно посмотреть в двух режимах: по вызовам и по строкам. Второй способ позволяет исследовать с максимальной детализацией — находить не только самые медленные функции, но и самые медленные их части. Для переключения между режимами используйте контекстное меню.
Для удобства различные элементы языка MQL отображаются в отчете иконками:
Помимо указанных типов функций, в профилировщике отображаются:
Номер строки и путь к файлу, где расположена функция, можно посмотреть при наведении курсора мыши на строку в отчете. Чтобы перейти к просмотру функции в файле, дважды щелкните на ней левой кнопкой мыши.
В профилировщике отображаются не все функции, а только те, что были вызваны во время работы программы. |
В контекстном меню доступны следующие команды: