вопрос к знатокам #define - страница 6

 
Igor Makanu:

если в тело цикла внести ищменеие размеров массивов, то оптимищация на лету уже не работает

так код измените:

))))  просто вам также предается менять значение своей переменной size, а значит именной первый способ с использованием ArraySIze будет в выигрыше

 
Alexandr Andreev:

Ну против ИМХО я ничего не могу сказать.

У меня на очень больших повторах победа стала случайной у первого и второго способа... скорее всего стало зависит от кэша проца на текущий момент и общей загрузки.

Вопрос был не касаемо цикла - а касаемо разворачивания функции. Просто в качестве примера был ArraySize

Это хорошо) Совершенство высокоуровневого языка как раз и проявляется когда удобная запись так же дешева, как и не удобная, но изначально дешевая. Жаль не всегда так, и справка с хелпом для новеньких совсем тоже не всегда..... вопросов бы не было бы)))

 
Igor Makanu:

если в тело цикла внести ищменеие размеров массивов, то оптимищация на лету уже не работает

так код измените:


не выходит

runtime оптимизация  в лидерах будет

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

Речь шла не про цикл а то как компилятор функции разворачивает..... да ладно в общем. 

Оставлю я вас

 
Alexandr Andreev:

))))  просто вам также предается менять значение своей переменной size, а значит именной первый способ с использованием ArraySIze будет в выигрыше

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

ну и возможно rand() тоже где то хорошо начал кэшироваться 


в общем я не знаю как тут тестировать без дебагера - там хоть время исполнения инструкций в тактах можно посмотреть

 
Alexandr Andreev:

дак докажите мне обратное)

а то у меня в тесте почему-то они одинаковые

Изменил свой пост.
Как то наоборот получается ArraySize теперь быстрее отрабатывает, чем переменная cnt.
Раньше наоборот было. Наверно инкремент cnt-- влияет, тело цикла разные и наверно надо что то другое придумать для нагрузки.

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms
 
Roman:

Что то странно.
Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt.
Раньше было наоборот. Может это ошибка? И так быть не должно.

Вы ничего не перепутали в своем коде, кто за вас будет значение 

cnt

изменять, как это происходит в первом варианте

 
void OnStart()
  {
   int mas[];
   int size=1000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100;
   uint t1=GetTickCount();
   int t=0;
   int tr=0; 
   MathSrand(10);
   for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r);// мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2=GetTickCount();
   for(ulong z=0; z<max; z++)
     {
     int v=size;
      for(ulong i=0; i<v; i++)
        { 
         r2+=rand();
         r--;
        }

     }

   uint t3=GetTickCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",t1," ",tr);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

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

Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

как вариант теста - можно еще подсунуть в каждый тест только свои массивы - в моем примере arr1,arr2..

т.е. будет tst1_arr1[],tst1_arr2[] .... и  tst2_arr1[],tst2_arr2[]


это будет более честный тест

я офф, сильно отвлекает - имхо, удобно, пользуйтесь

 
Igor Makanu:

в общем я не знаю как тут тестировать без дебагера - там хоть время исполнения инструкций в тактах можно посмотреть

Ну, да - без отладчика никуда. А в тактах там ... 

 
Roman:

Что то странно.
Использование ArraySize(arr) в условии цикла показывает меньшее время, чем использование переменной cnt.
Раньше было наоборот. Может это ошибка? И так быть не должно.

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

Ну и судя по фразе, что компиляторы делают на 3-4 курсе информатики ... в общем буду надеяться что достаточно необходимый уровень кадров не даст мне сильно нервничать в среде МКЛ)