Domande su OOP in MQL5 - pagina 69

 
fxsaber:
Ho ottenuto un risultato inaspettato.


imho, i test non sono comparabili

STRUCT2 ha un costruttore

STRUCT2 ha delle stringhe

non c'è documentazione sulle stringhe come implementate in MQL, abbiamo discussohttps://www.mql5.com/ru/forum/1111/page2732#comment_16181920


cioè nel vostro test, STRUCT2 funziona come una classe con un costruttore, che ha una "classe stringa" con un costruttore, che in effetti alloca più volte la memoria per l'oggetto

Penso che un test così complesso debba essere suddiviso in diversi test - il tempo di creazione delle strutture STRUCT1 e STRUCT2 e poi il tempo di accesso ai dati. Alcuni sviluppatori hanno scritto che la stringa viene allocata in memoria solo dopo l'accesso alla stringa - nel tuo esempio, la stringa è inizializzata da una stringa costante, quindi è difficile vedere come viene inizializzata - il compilatore potrebbe non inizializzare (o allocare la memoria?) le stringhe prima di accedervi

 
Igor Makanu:

Penso che un test così complesso dovrebbe essere suddiviso in diversi test

Non voglio nemmeno disturbare. Ho fatto strutture semplici.

#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


Per quale motivo l'accesso al primo campo di una struttura semplice dipende dalla sua dimensione - non è chiaro.

 
fxsaber:

Non voglio nemmeno disturbare. Ho fatto strutture semplici.



Per quale motivo l'accesso al primo campo di una struttura semplice dipende dalla sua dimensione - non è chiaro.

È meglio fare questa domanda agli sviluppatori del ramo corrispondente. Con codice di prova. O lo spiegheranno, o lo sistemeranno, o non diranno nulla... Solo la terza variante probabilmente funzionerà qui.

 
Artyom Trishkin:

Questa è una domanda che è meglio porre agli sviluppatori del ramo interessato. Con il codice di prova. O lo spiegheranno, o lo sistemeranno, o non diranno nulla... Qui c'è probabilmente solo la terza opzione.

Il mio MT5 ha iniziato a causare troppe bestemmie. Ci sono bug critici. Questa è una stronzata.

 
fxsaber:

Non voglio nemmeno disturbare. Ho fatto strutture semplici.

ora gli stessi test STRUCT1 e STRUCT3

fxsaber:

Non capisco perché l'accesso al primo campo di una struttura semplice dipende dalla sua dimensione.

Questo è solo un gioco di ipotesi.

un altro modo è aspettare che qualcuno faccia lo stesso test in C++ e mostri i risultati. Se c'è una grande differenza, significa che l'allocazione della memoria in MQL è implementata male

se i test 1 e 2 sono circa gli stessi, è Windows che alloca la memoria in questo modo

 
fxsaber:

Il mio MT5 ha iniziato a causare troppe bestemmie. Ci sono bug critici. Questa è una stronzata.

Si consiglia di segnalare tutti i bug. Critico e non. Senza emozioni, naturalmente :)

 
Igor Makanu:

se i test 1 e 2 sono più o meno gli stessi, allora questo è il modo in cui Windows alloca la memoria

ha eseguito l'ultimo test 2 volte su

Terminale MetaTrader 5 x64 build 2470 avviato per MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11GB memoria, 188/297GB disco, 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) Allarme: Tempo[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) Avviso: Tempo[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


non tutti i file sono allegati allo script, le ultime linee non hanno compilato

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

Avevo il Debug.mqh includer


UPD: sulla vecchia build ho eseguito il test

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



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

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

i risultati sono simili - il comportamento è lo stesso
 
Prova a scambiare i loro annunci, non dipende da quale è in cima alla pila?
 
Artyom Trishkin:

Tutti i bug dovrebbero essere preferibilmente segnalati. Critico o no. Senza emozioni, naturalmente :)

Sono stati creati rami dettagliati.

 
Vladimir Simakov:
Prova a scambiare i loro annunci, non dipende da quale è in cima alla pila?
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) Avviso: Tempo[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) Avviso: Tempo[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) Allarme: Tempo[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) Allarme: Tempo[tst_f.mq5 59: Func(Array1)] = 450 ms.

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

Non mi sembra che faccia alcuna differenza.
Motivazione: