Fragen zu OOP in MQL5 - Seite 69

 
fxsaber:
Ich habe ein unerwartetes Ergebnis erhalten.


Imho sind die Tests nicht vergleichbar.

STRUCT2 hat einen Konstruktor

STRUCT2 hat Zeichenketten

Es gibt keine Dokumentation über Strings, wie sie in MQL implementiert sind, wir habenhttps://www.mql5.com/ru/forum/1111/page2732#comment_16181920 diskutiert.


d.h. in Ihrem Test arbeitet STRUCT2 als Klasse mit einem Konstruktor, der eine "Stringklasse" mit einem Konstruktor hat, der in der Tat mehrmals Speicher für das Objekt zuweist

Ich denke, dass ein solch komplexer Test in mehrere Tests aufgeteilt werden muss - die Zeit der Erstellung von STRUCT1- und STRUCT2-Strukturen und dann die Zeit des Zugriffs auf die Daten. Einige Entwickler haben geschrieben, dass String erst nach dem Zugriff auf String Speicher zugewiesen wird - in Ihrem Beispiel wird String durch eine konstante Zeichenkette initialisiert, so dass es schwer zu sehen ist, wie er initialisiert wird - der Compiler initialisiert (oder weist Speicher zu?) Arrays von Strings möglicherweise nicht vor dem Zugriff auf sie

 
Igor Makanu:

Ich denke, ein so komplexer Test sollte in mehrere Tests aufgeteilt werden

Ich will mir nicht einmal die Mühe machen. Ich habe einfache Strukturen geschaffen.

#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


Aus welchem Grund der Zugang zum ersten Feld einer einfachen Struktur von ihrer Größe abhängt, ist nicht klar.

 
fxsaber:

Ich will mir nicht einmal die Mühe machen. Ich habe einfache Strukturen geschaffen.



Aus welchem Grund der Zugriff auf das erste Feld einer einfachen Struktur von ihrer Größe abhängt, ist nicht klar.

Es ist besser, diese Frage den Entwicklern im entsprechenden Zweig zu stellen. Mit Testcode. Entweder werden sie es erklären, oder sie werden es in Ordnung bringen, oder sie werden nichts sagen... Nur die dritte Variante wird hier wahrscheinlich funktionieren.

 
Artyom Trishkin:

Diese Frage stellt man am besten den Entwicklern in der entsprechenden Branche. Mit dem Testcode. Entweder werden sie es erklären, oder sie werden es in Ordnung bringen, oder sie werden nichts sagen... Hier gibt es wahrscheinlich nur die dritte Möglichkeit.

Mein MT5 hat angefangen, zu viel Profanität zu verursachen. Es gibt kritische Fehler. Das ist Blödsinn.

 
fxsaber:

Ich will mir nicht einmal die Mühe machen. Ich habe einfache Strukturen geschaffen.

jetzt die gleichen Tests STRUCT1 und STRUCT3

fxsaber:

Ich verstehe nicht, warum der Zugriff auf das erste Feld einer einfachen Struktur von ihrer Größe abhängt.

Das ist nur ein Ratespiel.

eine andere Möglichkeit ist, darauf zu warten, dass jemand den gleichen Test in C++ durchführt und die Ergebnisse anzeigt. Wenn es einen großen Unterschied gibt, bedeutet das, dass die Speicherzuweisung in MQL schlecht implementiert ist

wenn die Tests 1 und 2 in etwa gleich sind, ist es Windows, das den Speicher auf diese Weise zuweist

 
fxsaber:

Mein MT5 hat angefangen, zu viel Profanität zu verursachen. Es gibt kritische Fehler. Das ist Blödsinn.

Es ist ratsam, alle Fehler zu melden. Kritisch und nicht kritisch. Emotionslos, natürlich :)

 
Igor Makanu:

wenn die Tests 1 und 2 ungefähr gleich sind, dann ist das die Art und Weise, wie Windows den Speicher zuweist

den letzten Test 2 Mal durchgeführt

Terminal MetaTrader 5 x64 build 2470 gestartet für MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170 @ 3.70GHz, 8/11GB Speicher, 188/297GB Festplatte, 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


nicht alle Dateien sind an das Skript angehängt, die letzten Zeilen wurden nicht kompiliert

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

Ich hatte den Debug.mqh Includer


UPD: auf dem alten Build habe ich den Test durchgeführt

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

die Ergebnisse sind ähnlich - das Verhalten ist das gleiche
 
Versuchen Sie, die Anzeigen zu tauschen. Kommt es nicht darauf an, welche oben auf dem Stapel liegt?
 
Artyom Trishkin:

Alle Fehler sollten vorzugsweise gemeldet werden. Kritisch oder nicht. Ganz unaufgeregt natürlich :)

Es wurden detaillierte Verzweigungen erstellt.

 
Vladimir Simakov:
Versuchen Sie, die Ansagen zu vertauschen. Kommt es nicht darauf an, welche von ihnen oben auf dem Stapel liegt?
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) 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

Das scheint für mich keinen Unterschied zu machen.