Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике - страница 31

 
Edgar Akhmadeev:
А что дополнительные неопределенные погрешности вносит перемешивание кода и инлайнинг - что мешает не использовать оптимизацию при профилировании? Нас интересует не абсолютное время выполнения оператора, а относительное.
Иногда будут погрешности и в относительных значениях, но ничто не идеально.

Зачем это профилирование, если потом в релизе будет все иначе?

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

 
Edgar Akhmadeev:

Я нашёл причину, почему при профилировании показывало только одну функцию (да и та вызывается единожды при инициализации).

После удалении файла mqproj или сброса галочки "Максимальная оптимизация" стало выдавать реальную информацию.

Стало показывать информацию, но неправильно. Во многих местах отчёта, когда раскрываешь строку, там всё несвязанное между собой и между разворачиваемой строкой. На скриншоте я развернул только строки с такими ошибками.

UPD: пардон, последнюю (SymbolInfoDouble) развернул случайно. И OrderCalcMargin.

 
Andrey Khatimlianskii:

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

Незачем. Меня при профилировании интересуют медленные функции, которых инлайн не ускорит, и медленные операторы (в частности системные функции и серверные операции). Очень тяжело всё это разыскивать в большом проекте, профилирование очень помогает.

Мне трудно на пальцах объяснить преимущества, у каждого свои методы и технологии программирования, но в начале разработки мой эксперт работал в десятки раз медленнее. И в оптимизации кода помог в частности и профайлер.

 
Edgar Akhmadeev:

Стало показывать информацию, но неправильно. Во многих местах отчёта, когда раскрываешь строку, там всё несвязанное между собой и между разворачиваемой строкой. На скриншоте я развернул только строки с такими ошибками.

UPD: пардон, последнюю (SymbolInfoDouble) развернул случайно. И OrderCalcMargin.

Есть два режима показа результатов: по строкам и вызовам. Вы смотрите по строкам.

В этом случае показываются наиболее затратные строки в функции:



Если переключитесь врежим по вызовам, то будете видеть самые затратные вызовы этих функций:


 
Edgar Akhmadeev:

Незачем. Меня при профилировании интересуют медленные функции, которых инлайн не ускорит, и медленные операторы (в частности системные функции и серверные операции). Очень тяжело всё это разыскивать в большом проекте, профилирование очень помогает.

Мне трудно на пальцах объяснить преимущества, у каждого свои методы и технологии программирования, но в начале разработки мой эксперт работал в десятки раз медленнее. И в оптимизации кода помог в частности и профайлер.

Ну так новый профайлер и должен будет (когда будет допилен) показать самые затратные функции, которые тратят больше всего времени в релизном проекте.

Я тоже много пользовался профайлером, и тоже многое ускорил. Но в данном случае, мне кажется, вы просто рано перешли на новую бету и получили гору багов вместо желаемого отчета.

Все будет хорошо. Когда-то)

 
Renat Fatkhullin:

Есть два режима показа результатов: по строкам и вызовам. Вы смотрите по строкам.

Разве по моему скриншоту не видно, что это режим по вызовам?

Renat Fatkhullin:

В этом случае показываются наиболее затратные строки в функции:

Если переключитесь врежим по вызовам, то будете видеть самые затратные вызовы этих функций:

Это понятно. Я о том, что при разворачивании функции показываются строки, не имеющие к ней отношения. Или, в режиме по вызовам, вызовы других функций.

 
Andrey Khatimlianskii:

вы просто рано перешли на новую бету и получили гору багов вместо желаемого отчета.

100%

Просто как раз сейчас потребовалось оптимизировать код, а тут как раз новый профайлер...

Перейду пока к другим делам.

Andrey Khatimlianskii:

Все будет хорошо. Когда-то)

Мои слова.

 
Renat Fatkhullin:

Скорее всего это построение списков ваших предыдущих тестов. Которых у вас наверняка много.

Проверим и перепишем.

Спасибо, совсем забыл про MQL5\Profiles\Tester\*.ini. Оказалось, что там 13К конфигураций.

 

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

Новая версия платформы MetaTrader 5 build 2755: Улучшения в окне котировок и отладчике

fxsaber, 2021.01.30 11:40

Баг с кастомными символами.

Раньше при удалении группы, удалялись только скрытые символы в ней. Теперь удаляются все. Получается, что в Обзоре рынка висят вполне нормальные кастомные символы (работают запросы истории и т.д.), но при этом в базе данных символов (CTRL+U) их нет.


Просьба вернуть, как было.


b2775 - не поправили.

 
Edgar Akhmadeev:

Разве по моему скриншоту не видно, что это режим по вызовам?

Это понятно. Я о том, что при разворачивании функции показываются строки, не имеющие к ней отношения. Или, в режиме по вызовам, вызовы других функций.

Вспомните еще раз о тотальном смешивании кода и потере границ. Это легко дает захват чужих строк.

А если идут указания на }, то это чаще всего границы скопа/видимости, где автоматически вызываются невидимые деструкторы объектов. То есть, если видите много }, значит знатно мусорите и это серьезная проблема производительности.


Я уже показывал пример, когда 8 строк вычислений превращаются в 4 совмещенные 128 битные SSE2 инструкции вычисления корней. Тут все так смешано, что точных границ строк по факту не существует:

         D1=sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
         D2=sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
         D3=sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
         D4=sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
         D5=sqrt((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
         D6=sqrt((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
         D7=sqrt((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
         D8=sqrt((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));
        ...
        sqrtsd  xmm1, xmm1
        unpcklpd        xmm4, xmm4
        movapd  xmm3, xmmword ptr [rsp + 432]
        unpcklpd        xmm3, xmmword ptr [rsp + 384]
        subpd   xmm3, xmm4
        mulpd   xmm3, xmm3
        unpcklpd        xmm0, xmm0
        movapd  xmm5, xmmword ptr [rsp + 416]
        unpcklpd        xmm5, xmmword ptr [rsp + 400]
        subpd   xmm5, xmm0
        mulpd   xmm5, xmm5
        addpd   xmm5, xmm3
        sqrtpd  xmm8, xmm5
        movapd  xmm5, xmmword ptr [rsp + 464]
        subpd   xmm5, xmm4
        mulpd   xmm5, xmm5
        movapd  xmm7, xmm9
        subpd   xmm7, xmm0
        mulpd   xmm7, xmm7
        addpd   xmm7, xmm5
        movapd  xmm6, xmm10
        unpcklpd        xmm6, xmm11
        subpd   xmm6, xmm4
        movapd  xmm3, xmmword ptr [rsp + 368]
        unpcklpd        xmm3, xmmword ptr [rsp + 352]
        subpd   xmm3, xmm0
        movapd  xmm4, xmm8
        shufpd  xmm4, xmm4, 1
        sqrtpd  xmm5, xmm7
        mulpd   xmm6, xmm6
        mulpd   xmm3, xmm3
        addpd   xmm3, xmm6
        sqrtpd  xmm15, xmm3
        movapd  xmm0, xmm14
        unpcklpd        xmm0, xmmword ptr [rsp + 336]
        subpd   xmm0, xmm2
        mulpd   xmm0, xmm0
        movapd  xmm2, xmm0
        shufpd  xmm2, xmm2, 1
        addsd   xmm2, xmm0
        movapd  xmm0, xmm15
        shufpd  xmm0, xmm0, 1
        sqrtsd  xmm12, xmm2


Мы добавим режим отключения оптимизаций, чтобы можно было видеть картину вызовов лучше. Видеть лучше, но путем потери реальности.

Вот пример падения скорости на нашем тестовом коде, занимающемся хорошими вычислениями:

Режим запуска  время работы (секунд) 
Release 177.515
Profile (full optimizations) 194.453
Profile (inline disable) 737.875
Profile (no optimizations) 1314.641

Здесь видны потери, вносимые профайлером по сравнению с релизным кодом. Это очень немного и терпимо.

Главный метод отказа от инлайнов дает ухудшение скорости в 3.7 раза по сравнению с профайлингом релизной версии. Отключение оптимизаций увеличивает время еще в 1.7 раз.

Понятно, что без инлайнинга(это один из важнейших методов оптимизации) и остальных оптимизаций, верить в найденные узкие места вообще нельзя. В данном случае отключение оптимизаций дало в 6.7 раз более медленный код.

Профилирование кода - Разработка программ - Справка по MetaEditor
Профилирование кода - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Профилирование — это сбор характеристик программы во время ее выполнения. При профилировании замеряется время выполнения и количество вызовов...