Новая версия платформы MetaTrader 5 build 4230: больше встроенных приложений и расширение поддержки ONNX - страница 25

 

b4240, добавление строки замедляет выполнение строки выше.

Не стал приводить здесь весь код (по ссылке).


Результат для варианта двух строк.

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2024.03.20 07:22

Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 76 in OnStart: GetSum(TicksArray)] = 1672893 mcs.
Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 77 in OnStart: GetSum(TicksArray)] = 1684673 mcs.


Результат для одной строки (вторая удаляется).

Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 76 in OnStart: GetSum(TicksArray)] = 1074075 mcs.


Получается, что вторая строка замедляет первую в 1.5 раза!

Строка для поискаOshibka 099.

 
Renat Fatkhullin #:

Не надо использовать хакерские методы в циклах for - так вы портите компилятору шаблон оптимизации циклов/векторизации и в рабочих условиях получаете код хуже. При этом надо учитывать, что есть немалый шанс самообмана на усеченной синтетике бенчмарков, где некоторые хакерские методы могут показать фейковое улучшение.

Вот по этому поводу давний вопрос. Часто требуется конструкция вида

for(i=0; i<ArraySize(a); i++){...}

Есть ли смысл писать её как

s=ArraySize(a);
for(i=0; i<s; i++){...}

или как

for(i=ArraySize(a)-1; i>=0; i--){...}

или компилятор умеет делать такое сам?

А если функция другая? Например, что-то что-то из торговых функций XxxTotal()?

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

Или второй вариант i=ArraySize, где вызов функции явно однократный.
 
fxsaber #:

b4240, добавление строки замедляет выполнение строки выше.

Не стал приводить здесь весь код (по ссылке).


Результат для варианта двух строк.


Результат для одной строки (вторая удаляется).


Получается, что вторая строка замедляет первую в 1.5 раза!

Строка для поискаOshibka 099.

Посмотрим в какой код компилируется.
 
JRandomTrader #:
Вот по этому поводу давний вопрос
int testStart() {Print(__FUNCSIG__); return 0;}
int testCount() {Print(__FUNCSIG__); return 3;}

   for (int i = testStart(); i < testCount(); i++) {}

// int testStart()
// int testCount()
// int testCount()
// int testCount()
// int testCount()


   for (int i = testCount() - 1; i >= testStart(); i--) {}
// testCount()
// testStart()
// testStart()
// testStart()
// testStart()

 
Aleksandr Slavskii #:

Спасибо, пригодилось.

b4242, костыль не нужен, с ним не будет работать.

 
JRandomTrader #:
Вот по этому поводу давний вопрос
   for (int i = 0; i < ObjectsTotal(); i++) {
      Print(i, " ", ObjectsTotal());
      if (i == 5) ObjectCreate(0, "OBJ_VLINE", OBJ_VLINE, 0, TimeCurrent(), 0);
   }

0 300

1 300

2 300

3 300

4 300

5 300

6 301

7 301

8 301

9 301

...

299 301

300 301     "i < ObjectsTotal()" увидел новый объект


 
fxsaber #:

Просьба рассмотреть возможность файловых операций не только в песочнице (Read/Write: MQL5\Files\*.*), но и в тестерном кеше (Read: Tester\cache\*.tst, *.opt).

  • FileLoad.
  • FileIsExist.
  • FileFindFirst.
  • FileFindNext.
  • FileFindClose.
  • FileSelectDialog.

Сейчас для чтения этих файлов приходится подключать WinAPI, либо делать mklink, чтобы Маркет-продукты наделить доп. функционалом.

Строка для поиска: Uluchshenie 089.

Поддерживаю просьбу.

 
trader6_1 #:

И что это должно означать?

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

И понятно, что ресайзить массив (=создавать новый объект) внутри такого цикла - не самая лучшая идея.

 
JRandomTrader #:

И что это должно означать?

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

А вот этот вопрос, тайна покрытая мраком )))

Судя по косвенным признакам компилятор смотрит размер массива на каждой итерации (но это не точно)

JRandomTrader #:

И понятно, что ресайзить массив (=создавать новый объект) внутри такого цикла - не самая лучшая идея.

Что значит не лучшая идея? Это бывает необходимостью продиктованной логикой того над чем работаешь.