Errores, fallos, preguntas - página 2880

 
Igor Makanu:

no

si hay secciones de código repetitivas, ¡obtendrá pruebas de optimización!

¿Qué diferencia hay en el tiempo de ejecución de rand()?

Que se ejecute 2/3 del tiempo de la prueba, lo principal es que el tiempo de rand() sea constante

Su código MQL utilizará las funciones MQL del sistema, ¿verdad? - ¿qué sentido tiene probar un código perfecto?

)) la diferencia de velocidad podría ser 4 veces a favor de uno de los métodos (1 a 4), pero como la operación rand es 10 veces más lenta que el resto del código, esta diferencia no sería visible (11 a 14)

 
Alexandr Andreev:

)) La diferencia de velocidad podría haber sido 4 veces a favor de uno de los métodos (1 a 4), pero como la operación era 10 veces más larga que el resto del código, esta diferencia no habría sido visible (11 a 14)

No, no podría.

la diferencia es inmediatamente visible

comprobemos algo que los desarrolladores anunciaron en las innovaciones, a menudo escriben que el tiempo de acceso a las series de tiempo para alguna función ha sido optimizado = no se comprueba durante mucho tiempo

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

no es crítico en absoluto

el tiempo de ejecución de rand() es constante, lo más probable es que sea una función común de C++, busca en google "rand c++ source code"

debes inicializarlo, pero si lo inicializas con constantes puedes encontrarte con la optimización

en general, no entiendo la aversión a rand()

una opción es inicializar con algo como esto:

sería rápido.


corrió su script, imho no es correcto.

El tiempo principal es cargar el código en la caché y luego en el procesador

y añadir la discreción del temporizador del sistema

tenemos... casi un número al azar.

hay que probarlo durante mucho tiempo, unas 100500 veces, en mi opinión

rand() silencia el resultado.
En mi ordenador, una iteración del bucle tarda aproximadamente 1,5 nanosegundos.

Con dos rand(), una iteración tarda el doble, hasta casi 3 nanosegundos. Debes darte cuenta de que en esta iteración desaparecerán dos accesos a un elemento de un array grande, lo que también es bastante caro.
Significa que aproximadamente 2/3 de todo el tiempo de iteración se gasta en dos rands(). Por supuesto, me emocioné un poco con lo de "por un orden de magnitud" ))

No entiendo cómo se puede encontrar una optimización cuando un array preparado de antemano se llena de números aleatorios.

Ya se ha discutido el rendimiento de rand() una vez. Incluso he intentado escribir una función similar yo mismo.https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

resultado

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

Creo que la conclusión es que casi no hay diferencia si se utiliza la unión o el desplazamiento binario.
Yo uso ambos métodos en mi biblioteca de iCanvas para trabajar con el color.

union argb {
   uint clr;
   uchar c[4];
};


Lo recuerdo, yo también he estado haciendo pruebas de rendimiento y he llegado a la conclusión de que casi no hay diferencia. Pero el código con unión es más legible.
Debo admitir que me decepcionó porque esperaba obtener una ganancia de rendimiento notable con la unión.

 
Nikolai Semko:

No entiendo cómo se puede encontrar una optimización cuando un array preparado de antemano se llena de números aleatorios.

Te he dado 2 enlaces en el hubr de arriba, el primer artículo muestra bien cómo se ve un bucle normal después de la compilación.

No estoy diciendo que necesariamente se deba llegar a la optimización en tiempo de ejecución, pero imho, si la matriz no cambia, que es esencialmente un espacio de memoria constante con un tamaño constante para el bucle, no es un hecho que la optimización puede no aparecer en algún tipo de procesador, y la optimización puede esperarse tanto del compilador como del procesador con la caché


Nikolai Semko:

Creo que la conclusión es que no hay casi ninguna diferencia entre la unión y el cambio binario.

Sí, es cierto, voy a utilizar shift, el código es legible, y no hay necesidad de introducir un nuevo tipo de datos - union
 
Igor Makanu:

Te he dado 2 enlaces en el hbr arriba, el primer artículo muestra bien cómo se ve un bucle normal después de la compilación

No estoy diciendo que usted debe llegar a la optimización en tiempo de ejecución, pero imho, si la matriz no cambia, que es esencialmente un espacio de memoria constante con un tamaño constante para el bucle, no es seguro que ninguna optimización aparecerá

A juzgar por los resultados, no hay señales de optimización

 
Nikolai Semko:

Los resultados no dan ninguna impresión de optimización

El argumento no es sobre un código específico

pero en la metodología de las pruebas, sigo ciñéndome a lo que pruebo de forma óptima, y rand() aunque introduce distorsiones, pero es un coeficiente lineal, no proporcional, es decir, la precisión no es muy importante si no hay una diferencia de velocidad inferior al 5%, imho

 
Estimados, ¿alguien puede al menos darme una respuesta a esta situación que no entiendo?
 

Hola a todos.

Tengo una pregunta, tal vez para los desarrolladores de MQL5? Tal vez alguien más sabe... ¿Hay planes para integrar el compilador/editor de código ME con algunos entornos de desarrollo populares como IDEA o Visual Studio? El Meta Editor es un gran dolor para mí. No hay colapso de bloques, no hay plantillas de auto-sustitución (por ejemplo, cuando empiezas a escribir for(...) inmediatamente te ofrece sustituir un patrón de bucle y muchas otras cosas), no hay resaltado de varias partes importantes del código. Y así sucesivamente. No digo que los robots modernos sean complicados, se trata de grandes proyectos y hay exigencias mucho más serias para la gestión del código y la capacidad de desarrollo del equipo.

Ya nadie escribe sus propios editores y compiladores: todos renuncian a ellos y se pasan a las soluciones ya hechas de Microsoft, JetBrains y otros. Todos los editores modernos cuentan con sistemas de plugins personalizables que permiten añadirles lo que se quiera. En principio, la tarea no es difícil.

 
Сергей Таболин:
Estimados señores, ¿hay alguien que pueda darme una respuesta a esta situación que no entiendo?

Y deberías intimidar aún más a los programadores. Entonces, seguro que recibirás ayuda.