Задался вопросом: использует ли профилировщик инлайнинг кода и прочую оптимизацию?

 

Собственно вопрос в сабже. Есть критически важный метод. Его профилирование показало следующее:

 

Большая часть времени уходит вот на эти строки:

CBar* pbar = m_bars[i];
if(mbar.High() >= pbar.High())
...

И High метод и индекс m_bars[i] - являются примитивными Get-методами. Ожидается, что компилятор заинлайнит эти методы на прямые переменные или я ошибаюсь? Нормально ли что профилировщик как-будто показывает что вызов методов все-таки происходит или это нормальная картина и мне не надо париться?

 

Профилировщик не использует все оптимизации — это факт.

Но конкретнее ответят только разработчики. Только не понятно, что даст ответ )

ps: можно еще микро-секундным таймером мерять без профилировки. 

 

Представленный скриншот не раскрывает полной картины без дополнительных пояснений, конкретных цифр, условий и целей профилировки.

Например, я сделал такой вывод: в цикле из 1000 итераций выражение условия, подчёркнутое жёлтым фоном, было выполнено 1000 раз. При этом оно было истинным 365 раз, и 3 строчки, заключённые в операторных скобках под ним, были выполнены каждое выражение по 365 раз (а не 1000 раз, как Вы ожидали, судя из поставленного вопроса).

Как-то так.

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

PS и при чём тут инлайнинг?

 
Vasiliy Sokolov:

Собственно вопрос в сабже. Есть критически важный метод. Его профилирование показало следующее:

 

Большая часть времени уходит вот на эти строки:

И High метод и индекс m_bars[i] - являются примитивными Get-методами. Ожидается, что компилятор заинлайнит эти методы на прямые переменные или я ошибаюсь? Нормально ли что профилировщик как-будто показывает что вызов методов все-таки происходит или это нормальная картина и мне не надо париться?

По крайней мере в С++ переменные внутри функции должны создаваться в регистрах или на стеке. Хотя, интеловский компилятор так оптимизирует код, что без пол-литры не разобраться (там есть возможность включить генерацию asm).

В MQL это не посмотреть. 

 
Slawa:

Представленный скриншот не раскрывает полной картины без дополнительных пояснений, конкретных цифр, условий и целей профилировки.

Например, я сделал такой вывод: в цикле из 1000 итераций выражение условия, подчёркнутое жёлтым фоном, было выполнено 1000 раз. При этом оно было истинным 365 раз, и 3 строчки, заключённые в операторных скобках под ним, были выполнены каждое выражение по 365 раз (а не 1000 раз, как Вы ожидали, судя из поставленного вопроса).

Как-то так.

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

PS и при чём тут инлайнинг?

Наверное неправильно выразился: вызов методов mbar.High() и pbar.High() занимает значимое время. Вопрос: почему, если это пустые методы? Ожидалось, что инструкция if(mbar.High() >= pbar.High()) в общей сложности будет занимать время сравнимое с скажем простым перебором for.
 

В Вашем цикле for всего одно сравнение целочисленной переменной i с константым нулём. Ну очень дешёвая операция

В профилируемом выражении видим: загрузку в сопроцессор вещественного значения mbar.High(), ещё одну загрузку в сопроцессор вещественного значения pbar.High(), сравнение двух вещественных чисел (хоть и в сопроцессоре, но всё равно гораздо дороже целочисленного сравнения, тем более с константой), анализ результата сравнения

Примерно так. На пальцах.

 
Slawa:

В Вашем цикле for всего одно сравнение целочисленной переменной i с константым нулём. Ну очень дешёвая операция

В профилируемом выражении видим: загрузку в сопроцессор вещественного значения mbar.High(), ещё одну загрузку в сопроцессор вещественного значения pbar.High(), сравнение двух вещественных чисел (хоть и в сопроцессоре, но всё равно гораздо дороже целочисленного сравнения, тем более с константой), анализ результата сравнения

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