MT5 vs MT4. Скорость заполнения массивов.

 

Возникла необходимость замерить и сравнить скорость заполнения локальных и глобальных массивов на МТ4 и МТ5.

Для этого написал простой скрипт:

//+------------------------------------------------------------------+
//|                        Проверка скорости заполнения массивов.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
#define Rows     1000
#define Colomns  200
//+------------------------------------------------------------------+
int G_Array[Rows][Colomns];
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int L_Array[Rows][Colomns];
   //--------------------------
   ulong t1 = GetMicrosecondCount();
   //--------------------------
   for(int a1 = 0; a1 < Rows; a1++)
     {
      for(int a2 = 0; a2 < Colomns; a2++)
        {
         G_Array[a1][a2] = 1;
        }
     }
   //--------------------------
   ulong t2 = GetMicrosecondCount();
   //--------------------------
   Print("Время заполнения глобального массива  ",t2 - t1,"  микросекунд.  Заполнено ячеек:  ",Rows*Colomns);
   //--------------------------
   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < Rows; b1++)
     {
      for(int b2 = 0; b2 < Colomns; b2++)
        {
         L_Array[b1][b2] = 1;
        }
     }
   //--------------------------
   ulong t4 = GetMicrosecondCount();
   //--------------------------
   Print("Время заполнения локального массива  ",t4 - t3,"  микросекунд.  Заполнено ячеек:  ",Rows*Colomns);
   //--------------------------   
  }
//+------------------------------------------------------------------+

При изменении значений Rows и Colomns меняются размеры локального и глобоального массивов и скорость их заполениния.

Интересно, что разница скорости заполения глобального массива на МТ4 и МТ5 от 10 до 60 раз. Причем, всегда по разному. Чем больше ячеек, тем меньше степень превосходства. Однако, более 10-ти раз выходит практически всегда (в пользу МТ5).

Что касается локального массива:

1. Сравнение скорости заполнения локального и глобального массива на MT4 почти не выявляет разницы в скорости. Заполнение глобального массива даже чуть быстрее.

2. При сравнении скорости заполнения локального и глобального массива на МТ5, заполнение локального массива всегда 0 или 1 микросекунд (если более 20 000 000) ячеек. Иначе говоря, замер скорости заполения локального массива на МТ5 можно поставить под сомнение. Непонятно, почему всегда нулевое время заполнения.

Есть нюанс - локальный массив выходит за пределы 512 кб и возникает предупреждение. Возможно это влияет, и на МТ5 локальный массив вовсе не заполняется, если выходит за эти пределы.

Хочется разобратся.

(Скрипт работает на обоих платформах).

 
Реter Konow:

2. При сравнении скорости заполнения локального и глобального массива на МТ5, заполнение локального массива всегда 0 или 1 микросекунд (если более 20 000 000) ячеек. Иначе говоря, замер скорости заполения локального массива на МТ5 можно поставить под сомнение. Непонятно, почему всегда нулевое время заполнения.

Есть нюанс - локальный массив выходит за пределы 512 кб и возникает предупреждение. Возможно это влияет, и на МТ5 локальный массив вовсе не заполняется, если выходит за эти пределы.

В локальном массиве у МТ5 время замера ноль, так как компилятор выкидывает бесполезную работу с неиспользуемым впоследствии простым объектом. Это характеризует качество компилятора.

Вы нарушили правила проведения тестов компиляторов.

 
Renat Fatkhullin:

В локальном массиве у МТ5 время замера ноль, так как компилятор выкидывает бесполезную работу с неиспользуемым впоследствии простым объектом. Это характеризует качество компилятора.

Вы нарушили правила проведения тестов компиляторов.

Если я Вас правильно понимаю, то при выходе локального массива за 512 кб он не заполняется?

Или же просто сам замер неправильно осуществлен?

Как в таком случае сравнить?

 

Вопрос актуален так как занимаюсь графикой.

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

На МТ4 разницы в скорости заполнения между локальным и глобальным массивом не увидел.

На МТ5 скорость заполнения глобального массива в 10 - 60 раз быстрее (по моим опытам), но не понятна скорость заполнения локального массива.

Цель этой темы - выяснить этот вопрос.

 
Реter Konow:

Если я Вас правильно понимаю, то при выходе локального массива за 512 кб он не заполняется?

Или же просто сам замер неправильно осуществлен?

Как в таком случае сравнить?

Неправильно понимаете, потому что не знаете правил проведения бенчмарков компиляторов.

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

   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < Rows; b1++)
     {
      for(int b2 = 0; b2 < Colomns; b2++)
        {
         L_Array[b1][b2] = 1;
        }
     }
   //--------------------------
   ulong t4 = GetMicrosecondCount();
 
Реter Konow:

Вопрос актуален так как занимаюсь графикой.

Ищу способ ускорить заполнение массива (массив очень большой). Возникла идея, что локальные массивы заполняются быстрее.

1) Идея неправильная, локальные массивы быстрее не заполняются (грубо, не опускаясь на микро уровень)

2) Массивы быстро надо заполнять через штатные функции инициализации

3) Для максимизации скорости массив лучше держать вектором (одномерным), чтобы у тебя в руках оставалось больше шансов оптимизации доступа. Ибо многомерность жестко тебя ограничивает обязательными рамками и заставляет компилятор делать дополнительные постоянные вычисления многомерных индексов.

4) Массивы для быстрого доступа надо держать статическими, что резко уменьшает объем проверок на выходы за границы
 
Renat Fatkhullin:

Неправильно понимаете, потому что не знаете правил пробедения бенчмарков компиляторов.

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

Значит, мой замер скорости заполнения локального массива на МТ5 осуществлен неправильно.

Как в таком случае его осуществить?

Добавить например запись:

   ulong t3 = GetMicrosecondCount();
   //--------------------------
   for(int b1 = 0; b1 < Rows; b1++)
     {
      for(int b2 = 0; b2 < Colomns; b2++)
        {
         L_Array[b1][b2] = 1;
        }
     }
   //--------------------------
   ulong t4 = GetMicrosecondCount();
   //--------------------------
   int a = L_Array[0][0];
 
Реter Konow:

Если я Вас правильно понимаю, то при выходе локального массива за 512 кб он не заполняется?

Или же просто сам замер неправильно осуществлен?

Как в таком случае сравнить?


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

 
Ihor Herasko:

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

Если при этом будете сравнивать скорость доступа dynamic vs static, то получится неправильное сравнение.
 
Renat Fatkhullin:

1) Идея неправильная, локальные массивы быстрее не заполняются (грубо, не опускаясь на микро уровень)

2) Массивы быстро надо заполнять через штатные функции инициализации

3) Для максимизации скорости массив лучше держать вектором (одномерным), чтобы у тебя в руках оставалось больше шансов оптимизации доступа. Ибо многомерность жестко тебя ограничивает обязательными рамками и заставляет компилятор делать дополнительные постоянные вычисления многомерных индексов.

1. Ясно. Выйгрыша в скорости таким способом получить не удастся. Начал это подозревать после проверки на МТ4.

2. Массив в данном случае является носителем специфической пользовательской информации. Не совсем понял какими штатными функциями его заполнять...

3. В данном случае это пока невозможно. С других технических точек зрения, двумерный массив имеет массу преимуществ (для моих задач).

(Но спасибо за совет.)

 
Renat Fatkhullin:
Если при этом будете сравнивать скорость доступа dynamic vs static, то получится неправильное сравнение.

Так я и говорю о том, что нужно сравнить скорость заполнения динамических массивов:

  1. Выделить память. Желательно достаточно большую для уменьшения погрешности.
  2. Заполнить.
  3. Сравнить время заполнения.

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