О профилировщике кода MT5 - страница 2

 
Ilyas :

На скрине отображдается статистика для строки вызова, а не функции SymbolInfoTick.

Всего данная строка попала в замер 210 раз, один раз была "остановка" именно на строке, перед вызовом SymbolInfoTick или сразу после, и 209 раз как строка возврата из SymbolInfoTick

Извините, но это не ясно.

В сводке профилировщика говорится:

SymbolInfoTick () Всего ЦП: 209 (0,83%)

В самом коде сказано:

SymbolInfoTick () Всего ЦП: 210 (2,57%)

SymbolInfoTick () встречается только ОДИН РАЗ в коде. Что это за разные ценности, совершенно неясно. Хорошо, 209 против 210, вы сказали, что это потому, что он "остановил" один на этой линии (для меня это не логично, но, полагаю, не имеет большого значения).

А как насчет%?

0 2021.07.10 11: 52: 19.032 Профилировщик MQL5 Всего измерений 25039, ошибок 0/0, проанализировано 99 МБ стековой памяти (92872/1073741824)

Итак, 209 (0,83%) означает 100% = 25039. ОК

Но 210 (2,57%) означает 100% = 8171?!? Что это за 8171 для Total CPU?

 
Alain Verleyen :

А что насчет этого ( пост №1 )?

Как видите, SymbolInfoTick () показана как самая тяжелая часть кода. Что неверно. Это тот же код, что и в следующих сообщениях (который показывает SymbolInfoTick с Total CPU = 209 (0.83%), что верно), разница в том, что я прокомментировал строку, где SymbolInfoTick () было Total CPU = 1. Общее время выполнения (по историческим данным data) не изменилась с этим незначительным изменением, но результаты профилировщика были другими.

Я могу предоставить код наедине, если вы хотите проверить.

О профилировщике кода MT5
О профилировщике кода MT5
  • 2021.07.09
  • www.mql5.com
Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать...
 
Alain Verleyen:

Извините, но это не ясно.

В сводке профилировщика говорится:

SymbolInfoTick () Всего ЦП: 209 (0,83%)

В самом коде сказано:

SymbolInfoTick () Всего ЦП: 210 (2,57%)

SymbolInfoTick () встречается только ОДИН РАЗ в коде. Что это за разные ценности, совершенно неясно. Хорошо, 209 против 210, вы сказали, что это потому, что он "остановил" один на этой линии (для меня это не логично, но, полагаю, не имеет большого значения).

А как насчет%?

0 2021.07.10 11: 52: 19.032 Профилировщик MQL5 Всего измерений 25039, ошибок 0/0, проанализировано 99 МБ стековой памяти (92872/1073741824)

Итак, 209 (0,83%) означает 100% = 25039. ОК

Но 210 (2,57%) означает 100% = 8171?!? Что это за 8171 для Total CPU?

Вы сравниваете статистику для "строка кода" и для "функции"

Имеется строка кода

       if (! SymbolInfoTick (symbolф,tickф))     // Total CPU : 210 (2.57%)  Self CPU : 1 (1.49%)

Всего в статистику, данная строка попала 210 раз:

  • 209 раз как строка кода из которой вызывается SymbolInfoTick
  • 1 раз как оператор if

Имеется функция SymbolInfoTick, данная функция попала в статистику 209 раз.
Функция вызывается только из этой строки кода, возможно поэтому у Вас возникла путаница со счётчиками


Что касается цифр:
Итак, 209 (0,83%) означает 100% = 25039. ОК

это не так, цифры просто похожи: 209 / 0,83 * 100 = 25180


Но 210 (2,57%) означает 100% = 8171?!? Что это за 8171 для Total CPU?

Верно, из 25039 замеров, из них, 8171 замер пришёлся на строку кода с вызовом SymbolInfoTick

 

Alain Verleyen:

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

О профилировщике кода MT5

Ален Верлейен , 2021.07.10 14:20

До сих пор профилировщик не имеет для меня никакого смысла. Пример :

Профилирование по историческим данным.

2021.07.10 08:00: 37.101 Профилировщик MQL5 Всего 39289 измерений, ошибок 0/0, проанализировано 141 МБ памяти стека (93304/1073741824)

2021.07.10 08:00: 37.101 Профилировщик MQL5 Всего найдено 464876 функциональных кадров (39328 код mql5, 30115 встроенных, 269752 других, 125681 система)

В строке кода с SymbolInfoTick всплывающая подсказка говорит: Всего ЦП: 29353 (99,85%) Собственный ЦП: 0 (0,00%)

Бэктест выполняется в:

2021.07.10 08:00: 37.101 Ядро 01 EURUSD, H1: 230861 тик, сгенерировано 998 баров. Среда синхронизирована в 0: 00: 00.144. Тест пройден за 0: 03: 09.367 (включая предварительную обработку тиков 0: 00: 00.515).

Я добавил код для измерения времени выполнения SymbolInfoTick () с помощью GetMicrosecondCount ().

       ulong start= GetMicrosecondCount ();

       //--- Get tick information
       if (! SymbolInfoTick (symbol,tick))
         return ( false );

      BENCH += GetMicrosecondCount ()-start;

Результат:

2021.07.10 08:00: 37.101 Ядро 01 2021.05.30 23:59:59 Всего = 1209572 Выполнено = 836973 за 661874 микросекунды

Таким образом, SymbolInfoTick () в общей сложности занял 661 миллисекунду на исторических данных за 3 минуты 9 секунд. Тем не менее, профилировщик показывает, что использует 74,71% измерений. Насколько это точно или полезно, я не понимаю.


Позвольте прояснить, тестирование - это не только выполнение MQL кода + профилировщик, снимая статистику, немного замедляет выполнение.


При этом в отчёте, 74,71% - цифра относительно MQL кода, а не тестирования в целом

 

Привет @Ilyas!

Спасибо. Я проверю все еще раз с учетом ваших ответов и буду держать вас в курсе.

 
Ilyas:
...

Что касается цифр:

это не так, цифры просто похожи: 209 / 0,83 * 100 = 25180


Верно, из 25039 замеров, из них, 8171 замер пришёлся на строку кода с вызовом SymbolInfoTick

Я ошибся вс цифрами

Действительно, 209 - это 0.83469% от 25039, которые были округлены до 0.83


8171 замер пришёлся на ветку выполнения программы, в которой строка с вызовом SymbolInfoTick выполнилась 210 раз, что составляет 2.57%

 
Ilyas :

Я ошибся вс цифрами

Действительно, 209 - это 0.83469% от 25039, которые были округлены до 0.83


8171 замер пришёлся на ветку выполнения программы, в которой строка с вызовом SymbolInfoTick выполнилась 210 раз, что составляет 2.57%

Выполнение из OnTimer (), поэтому не совсем понятно, почему это 8171? Когда OnTimer () Total CPU показывает 29683.
 
Alain Verleyen:
Выполнение из OnTimer (), поэтому не совсем понятно, почему это 8171? Когда OnTimer () Total CPU показывает 29683.

Предоставьте пожалуйста код, я перепроверю работу счётчиков

 
Ilyas :

Предоставьте пожалуйста код, я перепроверю работу счётчиков

Я сделаю это наедине, как только у меня будет время. Спасибо.
 
Ilyas:

Иляс, помогите и мне разобраться.

1. Почему вызов пустой функции может занимать 34.5% Self CPU? При этом, вызов следующей за ней функции, внутренности которой выполняются 38.16% от Total CPU, не отображен в отчете вообще?


Код функций:



2. На этом же примере видна вторая проблема: строка с TimeCurrent() занимает неоправданно много времени в рамках не только функции, но и программы вообще:

До того, как я закомментировал тело CheckTimeSeries(), основная нагрузка приходилась на ее строку с TimeCurrent().

Неужели функция такая тяжелая? Чем ее заменить? Или как сделать экономной (кэширование в рамках одного цикла выполнения программы)?

Я везде, где можно, делаю экономные расчеты, прореживая вычисления (раз в бар, раз в Х секунд, раз в Y мс, и т.д.). Но получается, что сама проверка, нужно ли делать расчеты, весьма ресурсоемкая.


Благодарю за помощь.