Questions sur la POO dans MQL5 - page 69

 
fxsaber:
J'ai un résultat inattendu.


à mon avis, les tests ne sont pas comparables

STRUCT2 a un constructeur

STRUCT2 a des chaînes de caractères

il n'existe pas de documentation sur les chaînes de caractères telles qu'elles sont implémentées dans MQL, nous avons discuté dehttps://www.mql5.com/ru/forum/1111/page2732#comment_16181920.


c'est-à-dire que dans votre test, STRUCT2 fonctionne comme une classe avec un constructeur, qui a une "classe de chaîne" avec un constructeur, ce qui revient à allouer plusieurs fois de la mémoire pour l'objet.

Je pense qu'un test aussi complexe doit être décomposé en plusieurs tests - le temps de création des structures STRUCT1 et STRUCT2 et ensuite le temps d'accès aux données. Certains développeurs ont écrit que la chaîne n'est allouée en mémoire qu'après avoir accédé à la chaîne - dans votre exemple, la chaîne est initialisée par une chaîne constante, il est donc difficile de voir comment elle est initialisée - le compilateur peut ne pas initialiser (ou allouer de la mémoire ?) les tableaux de chaînes avant d'y accéder

 
Igor Makanu:

Je pense qu'un test aussi complexe devrait être décomposé en plusieurs tests

Je ne veux même pas me donner la peine. J'ai fait des structures simples.

#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 = 5 e7;
  
  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


Pour quelle raison l'accès au premier champ d'une structure simple dépend de sa taille - n'est pas clair.

 
fxsaber:

Je ne veux même pas me donner la peine. J'ai fait des structures simples.



Pour quelle raison l'accès au premier champ d'une structure simple dépend de sa taille - n'est pas clair.

Il est préférable de poser cette question aux développeurs de la branche correspondante. Avec le code de test. Soit ils l'expliquent, soit ils le réparent, soit ils ne disent rien... Seule la troisième variante fonctionnera probablement ici.

 
Artyom Trishkin:

C'est une question qu'il vaut mieux poser aux développeurs de la branche concernée. Avec le code de test. Soit ils l'expliquent, soit ils le réparent, soit ils ne disent rien... Il n'y a probablement que la troisième option.

Ma MT5 a commencé à provoquer trop de blasphèmes. Il y a des bugs critiques. C'est des conneries.

 
fxsaber:

Je ne veux même pas me donner la peine. J'ai fait des structures simples.

maintenant les mêmes tests STRUCT1 et STRUCT3

fxsaber:

Je ne comprends pas pourquoi l'accès au premier champ d'une structure simple dépend de sa taille.

C'est juste un jeu de devinettes.

un autre moyen est d 'attendre que quelqu'un fasse le même test en C++ et affiche les résultats. S'il y a une grande différence, cela signifie que l'allocation de mémoire dans MQL est mal implémentée.

Si les tests 1 et 2 sont à peu près identiques, c'est Windows qui alloue la mémoire de cette façon.

 
fxsaber:

Ma MT5 a commencé à provoquer trop de blasphèmes. Il y a des bugs critiques. C'est des conneries.

Il est conseillé de signaler tous les bogues. Critique et non critique. Sans émotion, bien sûr :)

 
Igor Makanu:

si les tests 1 et 2 sont à peu près les mêmes, alors c'est la façon dont Windows alloue la mémoire.

a effectué le dernier test 2 fois sur

Terminal MetaTrader 5 x64 build 2470 démarré pour MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11GB de mémoire, 188/297GB de disque, IE 11, UAC, GMT+4

2020.05.30 17:01:27.996 tst_f (EURUSD,H1) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [tst_f.mq5 57 : Func(Array3)] = 1888 ms.

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


tous les fichiers ne sont pas attachés au script, les dernières lignes n'ont pas compilé

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

J'avais l'inclusif Debug.mqh


UPD : sur l'ancienne version, j'ai effectué le test.

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



2020.05.30 17:13:17.046 tst (EURUSD,H1) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [tst.mq5 57 : Func(Array3)] = 1735 ms.

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

les résultats sont similaires - le comportement est le même
 
Essayez d'échanger leurs publicités. Ça ne dépend pas de celle qui est en haut de la pile ?
 
Artyom Trishkin:

Tous les bogues doivent de préférence être signalés. Critique ou non. Sans émotion bien sûr :)

Des branches détaillées ont été créées.

 
Vladimir Simakov:
Essayez d'intervertir leurs annonces. Ça ne dépend pas de celle qui est en haut de la pile ?
void OnStart()
{
  STRUCT3 Array3[]; // Простая структура большего размера.
  STRUCT1 Array1[]; // Простая структура.
  
  
  const int Amount = 5 e7;
  
  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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [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) Alerte : Temps [tst_f.mq5 59 : Func(Array1)] = 450 ms.

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

Cela ne semble pas faire de différence pour moi.
Raison: