Профилировщик не использует все оптимизации — это факт.
Но конкретнее ответят только разработчики. Только не понятно, что даст ответ )
ps: можно еще микро-секундным таймером мерять без профилировки.
Представленный скриншот не раскрывает полной картины без дополнительных пояснений, конкретных цифр, условий и целей профилировки.
Например, я сделал такой вывод: в цикле из 1000 итераций выражение условия, подчёркнутое жёлтым фоном, было выполнено 1000 раз. При этом оно было истинным 365 раз, и 3 строчки, заключённые в операторных скобках под ним, были выполнены каждое выражение по 365 раз (а не 1000 раз, как Вы ожидали, судя из поставленного вопроса).
Как-то так.
Если вы хотите профилировать именно эти три выражения, тогда надо обеспечивать безусловное их исполнение.
PS и при чём тут инлайнинг?
Собственно вопрос в сабже. Есть критически важный метод. Его профилирование показало следующее:
Большая часть времени уходит вот на эти строки:
И High метод и индекс m_bars[i] - являются примитивными Get-методами. Ожидается, что компилятор заинлайнит эти методы на прямые переменные или я ошибаюсь? Нормально ли что профилировщик как-будто показывает что вызов методов все-таки происходит или это нормальная картина и мне не надо париться?
По крайней мере в С++ переменные внутри функции должны создаваться в регистрах или на стеке. Хотя, интеловский компилятор так оптимизирует код, что без пол-литры не разобраться (там есть возможность включить генерацию asm).
В MQL это не посмотреть.
Представленный скриншот не раскрывает полной картины без дополнительных пояснений, конкретных цифр, условий и целей профилировки.
Например, я сделал такой вывод: в цикле из 1000 итераций выражение условия, подчёркнутое жёлтым фоном, было выполнено 1000 раз. При этом оно было истинным 365 раз, и 3 строчки, заключённые в операторных скобках под ним, были выполнены каждое выражение по 365 раз (а не 1000 раз, как Вы ожидали, судя из поставленного вопроса).
Как-то так.
Если вы хотите профилировать именно эти три выражения, тогда надо обеспечивать безусловное их исполнение.
PS и при чём тут инлайнинг?
В Вашем цикле for всего одно сравнение целочисленной переменной i с константым нулём. Ну очень дешёвая операция
В профилируемом выражении видим: загрузку в сопроцессор вещественного значения mbar.High(), ещё одну загрузку в сопроцессор вещественного значения pbar.High(), сравнение двух вещественных чисел (хоть и в сопроцессоре, но всё равно гораздо дороже целочисленного сравнения, тем более с константой), анализ результата сравнения
Примерно так. На пальцах.
В Вашем цикле for всего одно сравнение целочисленной переменной i с константым нулём. Ну очень дешёвая операция
В профилируемом выражении видим: загрузку в сопроцессор вещественного значения mbar.High(), ещё одну загрузку в сопроцессор вещественного значения pbar.High(), сравнение двух вещественных чисел (хоть и в сопроцессоре, но всё равно гораздо дороже целочисленного сравнения, тем более с константой), анализ результата сравнения
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно вопрос в сабже. Есть критически важный метод. Его профилирование показало следующее:
Большая часть времени уходит вот на эти строки:
И High метод и индекс m_bars[i] - являются примитивными Get-методами. Ожидается, что компилятор заинлайнит эти методы на прямые переменные или я ошибаюсь? Нормально ли что профилировщик как-будто показывает что вызов методов все-таки происходит или это нормальная картина и мне не надо париться?