Preguntas sobre POO en MQL5 - página 69

 
fxsaber:
Obtuve un resultado inesperado.


en mi opinión, las pruebas no son comparables

STRUCT2 tiene un constructor

STRUCT2 tiene cadenas

no hay documentación sobre las cadenas tal y como se implementan en MQL, hablamos dehttps://www.mql5.com/ru/forum/1111/page2732#comment_16181920


es decir, en su prueba, STRUCT2 funciona como una clase con un constructor, que tiene una "clase de cadena" con un constructor, que en efecto está asignando memoria para el objeto varias veces

Creo que una prueba tan compleja debe dividirse en varias pruebas - el tiempo de creación de las estructuras STRUCT1 y STRUCT2 y luego el tiempo de acceso a los datos. Algunos desarrolladores escribieron que la cadena se asigna a la memoria sólo después de acceder a la cadena - en su ejemplo, la cadena se inicializa por una cadena constante, por lo que es difícil ver cómo se inicializa - el compilador puede no inicializar (o asignar memoria?) matrices de cadenas antes de acceder a ellos

 
Igor Makanu:

Creo que una prueba tan compleja debería dividirse en varias pruebas

No quiero ni molestarme. Hice estructuras 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


No está claro por qué razón el acceso al primer campo de una estructura simple depende de su tamaño.

 
fxsaber:

No quiero ni molestarme. Hice estructuras simples.



No está claro por qué razón el acceso al primer campo de una estructura simple depende de su tamaño.

Es mejor hacer esta pregunta a los desarrolladores de la rama correspondiente. Con código de prueba. O lo explican, o lo arreglan, o no dicen nada... Aquí probablemente sólo funcione la tercera variante.

 
Artyom Trishkin:

Esta es una pregunta que es mejor plantear a los desarrolladores de la rama correspondiente. Con el código de prueba. O lo explican, o lo arreglan, o no dicen nada... Aquí está probablemente sólo la tercera opción.

Mi MT5 ha empezado a provocar demasiadas bromas. Hay fallos críticos. Esto es una mierda.

 
fxsaber:

No quiero ni molestarme. He hecho estructuras sencillas.

ahora las mismas pruebas STRUCT1 y STRUCT3

fxsaber:

No entiendo por qué el acceso al primer campo de una estructura simple depende de su tamaño.

Esto es sólo un juego de adivinanzas.

otra forma es esperar a que alguien haga la misma prueba en C++ y muestre los resultados. Si hay una gran diferencia, significa que la asignación de memoria en MQL está mal implementada

si las pruebas 1 y 2 son casi iguales, es Windows el que está asignando la memoria de esta manera

 
fxsaber:

Mi MT5 ha empezado a provocar demasiadas bromas. Hay fallos críticos. Esto es una mierda.

Es aconsejable informar de todos los errores. Crítico y no. Sin emociones, por supuesto :)

 
Igor Makanu:

si las pruebas 1 y 2 son más o menos iguales, entonces es la forma en que Windows está asignando la memoria

realizó la última prueba 2 veces en

Terminal MetaTrader 5 x64 build 2470 iniciado para MetaQuotes Software Corp.

Windows 10 build 18363, Intel Core i3-4170 a 3,70GHz, 8/11GB de memoria, 188/297GB de disco, IE 11, UAC, GMT+4

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

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


no todos los archivos se adjuntan a la secuencia de comandos, las últimas líneas no compilar

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

Tuve la inclusión de Debug.mqh


UPD: en la versión antigua hice la prueba

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



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

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

los resultados son similares - el comportamiento es el mismo
 
Intenta intercambiar sus anuncios. ¿No depende de cuál esté en la parte superior de la pila?
 
Artyom Trishkin:

Es preferible informar de todos los errores. Crítico o no. De forma impasible, por supuesto :)

Se han creado ramas detalladas.

 
Vladimir Simakov:
Prueba a intercambiar sus anuncios. ¿No depende de cuál esté en la parte superior de la 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) Alerta: Tiempo[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) Alerta: Tiempo[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) Alerta: Tiempo[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) Alerta: Tiempo[tst_f.mq5 59: Func(Array1)] = 450 ms.

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

A mí me parece que no hay ninguna diferencia.