![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Возьмите любой код из стандартной поставки, отпрофилируйте его и на его основе задавайте вопросы, пожалуйста. Это позволит воспроизводимо оценить ситуацию и дать точные ответы.
Иначе это никуда не годится по маленьким кускам вашего кода отвечать за отчеты профайлера. Там за бортом громадная работа оптимизатора, который весь ваш код превращает в совершенно другое перемешанное и встроенное представление.
Понимаю, что без воспроизведения точных ответов не будет.
Стандартные коды вряд ли возьмусь профилировать, но постараюсь давать воспроизводимые куски.
Благодарю за ответы!
1) На простом коде вряд ли воспроизведу, да. А весь проект отдать не готов.
2) В этом конкретном случае — согласен.
Но есть еще много других классов, в которых используется такая же или похожая проверка, и без TimeCurrent или GetTickCount не обойтись.
Как оптимизировать их вызов, чтобы не запрашивать то же значение несколько раз?
И действительно ли TimeCurrent настолько тяжелый, что может быть заметен на фоне действительно тяжелых расчетов (хоть и проводимых раз в 1 или 5 минут)?
Или я опять неправильно понял, и 38.16% Total CPU / 26.07% Self CPU занимала сама проверка if (без учета вызова функции TimeCurrent)? Но тогда почему это так?!
1) Это не помогает понять, почему такая прожорливая открывающая скобка. Как это интерпретировать?
2) Про SelfCPU теперь ясно, спасибо. Это нагрузка на код функции без учета вызываемых функций.
Это объясняет и низкий SelfCPU у строки с iTime — до нее доходило очень редко, она просто редко вызывалась.
Но почему при этом такой большой TotalCPU? Или он показывает на нагрузку всех iTime (и других CopyXXX функций?) во всей программе?
Стоит обратить внимание на объём локальных переменных функции, нужно учитывать, что объём может увеличиться из-за инлайнинга вызываемых
Если функция потребляет более 4Кб под локальные, то для обеспечения стековой памяти вызывается служебная функция - это суровая правда натива и от этого не избавиться
TotalCPU для строки - это "время" только этой строки
Разве не всегда должно быть 100%? Или даже немного меньше, учитывая также @global_initializations и @global_deinitializations.
Здесь больше 102% ...(Build 3003 on historical data).
По старому профилировщику в статье указывалось, что может быть больше
Профилирование дает нам важную статистику: сколько раз каждая из функций была вызвана, сколько времени было затрачено на ее выполнение. Возможно, вас немного собьет с толку статистика в процентах. Здесь нужно понимать, что статистика не рассматривает вложенность функций, поэтому сумма всех процентов будет много больше 100%.
По старому профилировщику в статье указывалось, что может быть больше
Стоит обратить внимание на объём локальных переменных функции, нужно учитывать, что объём может увеличиться из-за инлайнинга вызываемых
Если функция потребляет более 4Кб под локальные, то для обеспечения стековой памяти вызывается служебная функция - это суровая правда натива и от этого не избавиться
TotalCPU для строки - это "время" только этой строки
1) В теле функции объявляется только одна double переменная (не считая параметра функции const bool simulated).
2) То есть, процессор 55% времени получал iTime( m_symbol, PERIOD_CURRENT, 0 ) для одного из 11 рабочих инструментов (именно для него срабатывало условие "m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly")?
Или имеется в виду режим "Functions by Calls" (я показывал не его)?
Постараюсь сделать воспроизводимый отрывок кода с непонятными мне результатами, чтобы разговаривать предметно.
Прошу помочь с интерпретацией данных профайлера на простом примере.
Все выглядит, как лютый бред.
Очень стараюсь въехать, не выходит пока.
ЗЫ Пробовал замену Sleep.
Все также непонятные значения профайлера.
Прошу помочь с интерпретацией данных профайлера на простом примере.
Все выглядит, как лютый бред.
На MT4 этот же код выдает абсолютно логичные результаты.
Что делаю не так в MT5?
ЗЫ Последний билд MT5 с профилировщиком из MT4 - b2595 (b2593 - если выдает Internal compiler error).
А почему вы думаете, что написанный вами код равен тому, что фактически исполняется?
Мне пришлось написать столь простой пример, т.к. невозможно было объяснить значения профайлера на боевом советнике с значительным по размеру исходным кодом.
Выше задал вопросы. Как может, что он попадает в Sleep(1), но не попадает в Sleep(2). Уверен, Вы ничего не запускали и не смотрели, а просто сходу написали свой ответ.
Такая же ерунда выдается и при отключении оптимизации. Более того, старый профилировщик врет уже в b2596, где еще нового подхода не было. Потратил время на изучение...
Предположил, что умный оптимизатор два Sleep подряд объединяет в один. Но проверка показала, что это не так.
Sleep(2) не виден.