Артефакты MQL5

 

Как Вы думаете, от перестановки местами циклов, скорость исполнения программы меняется?

Вот два варианта: 

Вариант 1Вариант 2
#define ARRMAX     10000
struct arr
  {
   double            y1;
   double            y2;
   double            y3;
   double            y4;
   datetime          t;
  };
arr         arrstr[];
datetime    arrdat[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(arrstr,ARRMAX,ARRMAX);
   ArrayResize(arrdat,ARRMAX,ARRMAX);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0; i<ARRMAX; i++)
     {
      if(i==0) arrdat[i]=0;
      arrdat[i]+=i;
      arrdat[i]+=i;
      arrdat[i]+=i;
     }
   for(int i=0; i<ARRMAX; i++)
     {
      if(i==0) arrstr[i].t=0;
      arrstr[i].t+=i;
      arrstr[i].t+=i;
      arrstr[i].t+=i;
     }
  }
#define ARRMAX     10000
struct arr
  {
   double            y1;
   double            y2;
   double            y3;
   double            y4;
   datetime          t;
  };
arr         arrstr[];
datetime    arrdat[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ArrayResize(arrstr,ARRMAX,ARRMAX);
   ArrayResize(arrdat,ARRMAX,ARRMAX);
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   for(int i=0; i<ARRMAX; i++)
     {
      if(i==0) arrstr[i].t=0;
      arrstr[i].t+=i;
      arrstr[i].t+=i;
      arrstr[i].t+=i;
     }
   for(int i=0; i<ARRMAX; i++)
     {
      if(i==0) arrdat[i]=0;
      arrdat[i]+=i;
      arrdat[i]+=i;
      arrdat[i]+=i;
     }
  }

 

ВНИМАНИЕ, вопрос: Какой вариант быстрее?

 
А по моему они одинаковые.
 

Можете проверить, но второй быстрее!

 
DC2008:

Можете проверить, но второй быстрее!

Мы можем проверить, сумейте вы.
 
DC2008:

Можете проверить, но второй быстрее!

На сколько второй быстрее первого в Ваших тестах? ))
 
tol64:
На сколько второй быстрее первого в Ваших тестах? ))

Примерно на 6%.

 
Объясните, что значит . t, его смысл?
 
DC2008:

Примерно на 6%.

Ну не знаю. ))



 
tol64:Ну не знаю. ))

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

ЗЫ: разница в 16 мс несерьезно как то 

 
avoitenko:
Как вы их вычислили? Приведите код пожалуйста.

Так код же приведён в таблице. Пропускаете в тестере, хотя бы за неделю, на всех тиках.

 

Файлы:
test_1.mq5  2 kb
test_2.mq5  2 kb
 
IgorM:

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

ЗЫ: разница в 16 мс несерьезно как то 

16 мс - граница точности GetTickCount. То есть, замерять разницу во времени в пределах 32 мс нельзя из-за диких погрешностей.
Причина обращения: