Вопросы по ООП в MQL5 - страница 69

 
fxsaber:
Получил неожиданный результат.


имхо, тесты не сопоставимые

STRUCT2 имеет конструктор

STRUCT2 имеет строки

про строки нет документации как реализованы в MQL, обсуждали https://www.mql5.com/ru/forum/1111/page2732#comment_16181920


т.е. в Вашем тесте STRUCT2 работает как класс с конструктором, в котором находится " класс string " с конструктором , что по сути выделение памяти для обьекта несколько раз

думаю такой сложный тест нужно разбивать на несколько тестов - протестировать время создания структур STRUCT1 и STRUCT2 и потом время доступа к данным, кто то из разработчиков писал, что память у string выделяется лишь после обращения к string - у Вас в примере, string инициализирован вообще костантной строкой, сложно предположить как происходит инициализация - компилятор вообще мог не инициализировать массивы  строк ( или не выделять память ? ) до обращения к ним

 
Igor Makanu:

думаю такой сложный тест нужно разбивать на несколько тестов

Даже возиться не хочу. Сделал простые структуры.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

// Простая структура.
struct STRUCT1
{
  int i;
  double j[2];
};

// Простая структура большего размера.
struct STRUCT3
{
  int i;
  double j[10];
};

template <typename T>
int Func( T &Array[] )
{  
  // Write
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Array[i].i = i;

  int Sum = 0;
  
  // Read
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i].i;
    
  return(Sum + ArraySize(Array));    
}

#include <Debug.mqh>

void OnStart()
{
  STRUCT1 Array1[]; // Простая структура.
  STRUCT3 Array3[]; // Простая структура большего размера.
  
  const int Amount = 5e7;
  
  Print(_B(ArrayResize(Array1, Amount), 1));
  Print(_B(ArrayResize(Array3, Amount), 1));
      
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  
  _P2(sizeof(STRUCT1));
  _P2(sizeof(STRUCT3));
}


        50000000
        50000000
        Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms.
        1333106752
        Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms.
        1333106752
        : sizeof(STRUCT1) = 20
        : sizeof(STRUCT3) = 84


По какой причине доступ к первому полю простой структуры зависит от ее размера - не понятно.

 
fxsaber:

Даже возиться не хочу. Сделал простые структуры.



По какой причине доступ к первому полю простой структуры зависит от ее размера - не понятно.

Этот вопрос лучше задавать разработчикам в соответствующей ветке. С кодом теста. Либо объяснят, либо исправят, либо ничего не скажут... Здесь - наверняка только третий вариант.

 
Artyom Trishkin:

Этот вопрос лучше задавать разработчикам в соответствующей ветке. С кодом теста. Либо объяснят, либо исправят, либо ничего не скажут... Здесь - наверняка только третий вариант.

У меня MT5 стал слишком много ненормативной лексики вызывать. Есть критические баги. Это - фигня.

 
fxsaber:

Даже возиться не хочу. Сделал простые структуры.

сейчас одинаковые тесты STRUCT1 и STRUCT3

fxsaber:

По какой причине доступ к первому полю простой структуры зависит от ее размера - не понятно.

тут только на кофейной гуще гадать

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

если тесты 1 и 2  будут примерно одинаковые, тогда это Винда так память выделяет

 
fxsaber:

У меня MT5 стал слишком много ненормативной лексики вызывать. Есть критические баги. Это - фигня.

Желательно о всех багах сообщать. Критических и нет. Безэмоционально конечно :)

 
Igor Makanu:

если тесты 1 и 2  будут примерно одинаковые, тогда это Винда так память выделяет

запустил последний тест 2 раза на

Terminal MetaTrader 5 x64 build 2470 started for MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170  @ 3.70GHz, 8 / 11 Gb memory, 188 / 297 Gb disk, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:01:28.002 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 56: Func(Array1)] = 512 ms.

2020.05.30 17:01:28.515 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 57: Func(Array3)] = 2218 ms.

2020.05.30 17:01:30.734 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:01:41.278 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 9 ms.

2020.05.30 17:01:41.287 tst_f (EURUSD,H1) 50000000

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 56: Func(Array1)] = 552 ms.

2020.05.30 17:01:41.840 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 57: Func(Array3)] = 1888 ms.

2020.05.30 17:01:43.728 tst_f (EURUSD,H1) 1333106752


не все фалы прикреплены для скрипта, не скомпилировались последние строки 

  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));

инклудник Debug.mqh у меня был 


UPD: на старом билде запустил тест

2020.05.30 17:17:27.604 Terminal MetaTrader 5 - build 2361 



2020.05.30 17:13:17.046 tst (EURUSD,H1) Alert: Time[tst.mq5 53: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:13:17.047 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.053 tst (EURUSD,H1) Alert: Time[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:13:17.053 tst (EURUSD,H1) 50000000

2020.05.30 17:13:17.563 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 510 ms.

2020.05.30 17:13:17.563 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:19.416 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1852 ms.

2020.05.30 17:13:19.416 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:28.971 tst (EURUSD,H1) Alert: Time[tst.mq5 53: ArrayResize(Array1,Amount)] = 2 ms.

2020.05.30 17:13:28.971 tst (EURUSD,H1) 50000000

2020.05.30 17:13:28.977 tst (EURUSD,H1) Alert: Time[tst.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:13:28.977 tst (EURUSD,H1) 50000000

2020.05.30 17:13:29.456 tst (EURUSD,H1) Alert: Time[tst.mq5 56: Func(Array1)] = 478 ms.

2020.05.30 17:13:29.456 tst (EURUSD,H1) 1333106752

2020.05.30 17:13:31.192 tst (EURUSD,H1) Alert: Time[tst.mq5 57: Func(Array3)] = 1735 ms.

2020.05.30 17:13:31.192 tst (EURUSD,H1) 1333106752

результаты похожие - поведение такое же
 
А попробуй их объявление местами поменять.  Не зависит ли от того, какая из них наверху стека оказалась?
 
Artyom Trishkin:

Желательно о всех багах сообщать. Критических и нет. Безэмоционально конечно :)

Подробные ветки создал.

 
Vladimir Simakov:
А попробуй их объявление местами поменять.  Не зависит ли от того, какая из них наверху стека оказалась?
void OnStart()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
  const int Amount = 5e7;
  
  Print(_B(ArrayResize(Array3, Amount), 1));
  Print(_B(ArrayResize(Array1, Amount), 1));
  
      
  Print(_B(Func(Array3), 1)); // зависит от ее размеров.
  Print(_B(Func(Array1), 1)); // Чтение и запись простой структуры
  
  //_P2(sizeof(STRUCT1));
//  _P2(sizeof(STRUCT3));
}

2020.05.30 17:33:07.892 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 54: ArrayResize(Array3,Amount)] = 6 ms.

2020.05.30 17:33:07.955 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 55: ArrayResize(Array1,Amount)] = 1 ms.

2020.05.30 17:33:07.957 tst_f (EURUSD,H1) 50000000

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 58: Func(Array3)] = 1945 ms.

2020.05.30 17:33:09.902 tst_f (EURUSD,H1) 1333106752

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) Alert: Time[tst_f.mq5 59: Func(Array1)] = 450 ms.

2020.05.30 17:33:10.353 tst_f (EURUSD,H1) 1333106752

по моему ничего не изменилось