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

 
Igor Makanu:

если физически в команда ЦПУ, то нет

массив это участок памяти, доступ к элементам массива - это расчет индекса элемента от начала этого участка памяти и извлечение данных (байты)  в соответствии с хранимым типом 


если это логика алгоритма, то да - это индексируемые переменные

 в общем по изучаемой проблеме, единственный правильный совет https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

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

Время верхнего в два раза меньше чем у нижнего


Ну технически мы сравнивали две переменных))

 
Alexandr Andreev:

Время исполнения бинарной операции в разы быстрее чем время исполнения оператора if (так и должно быть).... 

в циклах не должно быть if() , раньше цикл по регистру CX исполнялся

Alexandr Andreev:

Время верхнего в два раза меньше чем у нижнего

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

 
Igor Makanu:

в циклах не должно быть if() , раньше цикл по регистру CX исполнялся

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

.... Вам надо следить за своими постами)))) пост выше ссылается на пост в котором предполагалось что оператор ArraySize делает проверку на вылет за пределы (ЭТО и есть Ваш if) и именно добавив его в тело реально проверить, и это единственно верный способ.

И разница от того что запускать первый есть только в Ваших тестах) 

 
Alexandr Andreev:

И разница от того что запускать первый есть только в Ваших тестах) 

Ваш тест дайте, посмотрим

хотя... нафиг, вообще на автомате в споре участвую, нравится пользуйте, я другого мнения о целесообразности использования ArraySize() в условии прекращения цикла

 

размеры .ex5

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
А кто знает кроме создателей компилятора? Может ArraySize() работает точно так же, как обращение к переменной. Это кажется возможным. 
 
Dmitry Fedoseev:
А кто знает кроме создателей компилятора? Может ArraySize() работает точно так же, как обращение к переменной. Это кажется возможным. 
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

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

ArraySize

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

вопрос к знатокам #define

Igor Makanu, 2020.11.03 11:39

Ваш тест дайте, посмотрим

хотя... нафиг, вообще на автомате в споре участвую, нравится пользуйте, я другого мнения о целесообразности использования ArraySize() в условии прекращения цикла


и нету разницы от перестановки
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

опять тест от_балды....

Вы почему тестируете один раз свое творение?

протестируйте хоть десять раз, чтобы посмотреть что происходит

обернул во внешний цикл код, результат:

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

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

в общем Метаквоты хорошо поработали над анализом типовых кодов от юзеров, т.е. большинство писанины юзеров компилятор сам приведет в порядок,.. имхо круто!

 

Извините, возможно ошибаюсь. Всё ЭТО не читал. Только первую страницу. Впечатление - как обычно. Кто-то задаёт конкретный вопрос. И тут же налетают флудерасты. 

Ещё раз извините, А ЭТО ДЕЙСТВИТЕЛЬНО ФОРУМ РАЗРАБОТЧИКОВ ????

 
Сергей Таболин:

Извините, возможно ошибаюсь. Всё ЭТО не читал. Только первую страницу. Впечатление - как обычно. Кто-то задаёт конкретный вопрос. И тут же налетают флудерасты. 

Ещё раз извините, А ЭТО ДЕЙСТВИТЕЛЬНО ФОРУМ РАЗРАБОТЧИКОВ ????

Ошибаетесь, там и другие вопросы поднялись, отличные от вопросов ТС. А понимание принципов компиляции иногда выручает.

Причина обращения: