Preguntas sobre POO en MQL5 - página 71

 
Igor Makanu:

si escribe tales clases:

A juzgar por su investigación, la clase B será más lenta de ejecutar si se utilizan frecuentemente campos de estructura en los cálculos?

Entonces, estábamos discutiendo el tiempo de recorrer un array de objetos))

Según tu ejemplo será igual en pluses, pero en mql hay un matiz, hay dos campos implícitos que van primero, por lo que, el campo de datos será abordado por desplazamiento, es decir, cálculos adicionales durante la desreferenciación.

 
Vladimir Simakov:

Entonces, estábamos discutiendo el tiempo de recorrido de la matriz de objetos))

Según tu ejemplo sería lo mismo en pluses, pero en mql hay un matiz, hay dos campos implícitos, que van primero, por lo que, se accederá al campo de datos por desplazamiento, es decir, cálculos adicionales durante la desreferenciación.

Gracias, es muy útil.

 
Vladimir Simakov:

Entonces, estábamos discutiendo el tiempo de recorrido de la matriz de objetos))

Según tu ejemplo será igual en pluses, pero en mql hay un matiz: hay dos campos implícitos que van primero, por lo que se accederá al campo de datos con un desplazamiento, es decir, se realizarán cálculos adicionales de desreferenciación.

Ambas clases son similares. El acceso es por desplazamiento en ambos casos, sólo que no en relación con el inicio de la estructura, sino en relación con el inicio de la clase. En otras palabras, la estructura en sí no tiene peso, sólo las clases crean una sobrecarga.
 
Vladimir Simakov:

Así pues, nada de misticismo: las leyes de la física en acción.

No se ajusta a las "leyes de la física".

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

long f1( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * i;
    
    Sum |= 1;
  }
    
  return(Sum);
}

long f2( const int Size, const long Amount = 5 e9 )
{
  long Sum = 0;
  
  for (long i = 0; i < Amount; i++)
  {
    Sum += Size * (Amount - i);
    
    Sum |= 1;
  }
    
  return(Sum);
}

void OnStart()
{
  Print(_B(f1(2), 1));
  Print(_B(f1(200), 1));
  
  Print(_B(f2(2), 1));
  Print(_B(f2(200), 1));
}


        Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms.
        6553255921290448385
        Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms.
        -8757194524499019775
        Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms.
        6553255931290448385
        Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms.
        -8757193524499019775


Se trata de un resultado paradójico. Los cálculos más complejos se realizan 1,5 veces más rápido y no dependen del tamaño.

 
Vladimir Simakov:

Entonces, estábamos discutiendo el tiempo de recorrido de la matriz de objetos))

Según tu ejemplo será lo mismo en pluses, pero hay un matiz en mql - hay dos campos implícitos que van primero, por lo que se accederá al campo de datos con un desplazamiento, es decir, se realizarán cálculos adicionales de desreferenciación.

Gracias a Vladimir por el estudio del ensamblador.
Y como sugiere Alexey, la sobrecarga es creada por las clases.
De esto podemos concluir que si se puede prescindir de las clases, es mejor escribir el código en estilo procedimental.
Es decir, si la tarea no requiere velocidad, puedes envolverla en una clase, pero si se trata de ticks, por ejemplo, es mejor usarla directamente sin envoltorios.
En principio, este es el enfoque que he seguido, y a menudo encontrar un ejemplo de una clase, desmontar sus métodos en el enfoque de procedimiento.

 
Roman:

Gracias Vladimir por el estudio de montaje.
Y como sugiere Alexey, la sobrecarga crea clases.
De esto podemos concluir que si podemos prescindir de las clases, es mejor escribir el código en estilo procedimental.
Es decir, si la tarea no requiere velocidad, puedes envolverla en una clase, pero si se trata de ticks, por ejemplo, es mejor escribir directamente sin envoltorios.
En principio, este es el enfoque que he estado siguiendo y, a menudo, al encontrar un ejemplo de una clase, desmonto sus métodos utilizando el enfoque procedimental.

Hay un troll en el foro...
Antes no entendía por qué algunos usuarios pedían la función de ignorar, ah como ahora no está...

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Preguntas sobre POO en MQL5

fxsaber, 2020.05.30 14:06

No tengo ni idea de qué hacer con él. He hecho estructuras sencillas.

        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 sé por qué el acceso al primer campo de una estructura simple depende de su tamaño.

Estás utilizando 50M elementos en un array.
Para estructuras de tamaño 20 y 84 bytes, esto supone 0,93GB y 3,91GB de datos, respectivamente.
Y en el marco de su cálculo, presumiblemente, toda esta memoria pasa por la caché del procesador.
Y una explicación muy lógica para estos resultados sería que 0,93 GB de datos se descargaran de la memoria a la caché de la CPU cuatro veces más rápido que los 3,91 GB de datos.

¿Y los resultados de la prueba C++?
Porque he visto código ensamblador, pero no resultados de pruebas, ¿o es que he mirado mal?
 
Sergey Dzyublik:

Hay un troll en el foro...
Antes no entendía por qué algunos usuarios pedían la función de ignorar, ah cómo ahora no está...

Debes velar por ti, no por los demás.
Ni tú ni para ti fue la respuesta.
Ignorar en silencio ))

 
Sergey Dzyublik:
Estás utilizando 50M elementos en un array.
Para estructuras de 20 y 84 bytes, son 0,93GB y 3,91GB de datos respectivamente.
Y como parte de su cálculo, presumiblemente toda esta memoria pasa por la caché del procesador.
Y una explicación muy lógica para estos resultados sería que 0,93 GB de datos se descargaran de la memoria a la caché de la CPU cuatro veces más rápido que los 3,91 GB de datos.

¿Y los resultados de la prueba C++?
Porque he visto código ensamblador, pero no resultados de pruebas, ¿o es que he mirado mal?
Funciona de la misma manera. Sólo es un poco más rápido, pero la proporción es la misma, así que es hardware.
 
Roman:

Gracias Vladimir por el estudio de montaje.
Y como sugiere Alexey, la sobrecarga crea clases.
De esto podemos concluir que si podemos prescindir de las clases, es mejor escribir el código en estilo procedimental.
Es decir, si la tarea no requiere velocidad, puedes envolverla en una clase, pero si se trata de ticks, por ejemplo, es mejor escribir directamente sin envoltorios.
En principio, este es el enfoque que adopto, y a menudo encontrando un ejemplo de una clase, desmonto sus métodos en estilo procedimental.

Puedes usar una estructura en lugar de una clase, están bien.