pregunta para los expertos en #define - página 5

 
Alexandr Andreev:

Dame el código completo de tu prueba

aquí tienes, pero no veo el sentido de volver a hablar de rand(), alternativamente sustitúyelo por alguna variable inc++

#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}



//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

}


Sí... Tengo un error en mi código, quiero que salga el tiempo en segundos, pero me sale 10 veces más, lo he dividido correctamente por 1 000 000, ¿quién me puede decir cuál es la razón?

 
Igor Makanu:

aquí tienes, pero no veo el punto de discutir rand() de nuevo, alternativamente reemplazarlo con alguna variable inc++


Sí... Algún tipo de error en mi código, quiero que salga el tiempo en segundos, pero me sale 10 veces más, lo he dividido correctamente por 1 000 000, ¿quién me puede decir cuál es la razón?

BOMBA.

aquí está su código que demuestra que es al revés.

//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#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;} \
                                              printf("%s: loops = %llu seconds=%.4f",msg,count,(double)(GetTickCount()-mss)/1000000.0);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void OnStart()
{
   int arr1[], arr2[], arr3[];
   int cnt1 = ArrayResize(arr1, 100);
   int cnt2 = ArrayResize(arr2, 200);
   int cnt3 = ArrayResize(arr3, 300);
   ulong sum = 0;

   
   SpeedTest(3,"cnt",
      for(int i = 0; i < cnt1; i++)
      {
         for(int j = 0; j < cnt2; j++)
         {
            for(int k = 0; k < cnt3; k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )

   SpeedTest(3,"ArraySize",
      for(int i = 0; i < ArraySize(arr1); i++)
      {
         for(int j = 0; j < ArraySize(arr2); j++)
         {
            for(int k = 0; k < ArraySize(arr3); k++)
            {
               arr3[k] = rand();
               sum += arr3[k];
            }
            arr2[j] = rand();
            sum += arr2[j];
         }
         arr1[i] = rand();
         sum += arr1[i];
      }
   )
}
 
Alexandr Andreev:

BOMBA

Aquí está su código que demuestra lo contrario.

Acabo de cambiar los cheques.

 
Alexandr Andreev:

Acabo de cambiar los cheques

2020.11.02 21:01:38.590 22222 (USDCHF,H1) cnt: loops = 1000 seconds=821.7159

2020.11.02 21:01:52.353 22222 (USDCHF,H1) ArraySize: loops = 1000 seconds=807.9415


De esto resulta queArraySize es más rápido que usar una variable =))) algo está mal en la prueba
 
Roman:

¿Qué prueba? ))
Usted mismo ha mostrado las dos variaciones de la condición de ciclo.
Igor también dio el código anterior.
Sólo hay que medir el rendimiento del bucle con tamaño variable y con ArraySize() en la condición del bucle.

Demuestra que me equivoco)

porque en mi prueba son iguales

 
Alexandr Andreev:

Acabo de cambiar los cheques.

Sí, tienes que hacer eso.

Esta vez me dio mucha pereza.

Envolviendo las pruebas en un bucle externo, lo conseguí así:

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=13.4910

 
Igor Makanu:

Sí, hay que hacerlo.

Esta vez me dio mucha pereza.

Envolviendo las pruebas en un bucle externo, obtuve esto

2020.11.02 22:06:43.557 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=117.4626

2020.11.02 22:06:58.328 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=102.7337

2020.11.02 22:07:13.075 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=87.9782

2020.11.02 22:07:27.850 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=73.2461

2020.11.02 22:07:42.598 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=58.4859

2020.11.02 22:07:57.380 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=43.7522

2020.11.02 22:08:12.891 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=28.9861

2020.11.02 22:08:28.874 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=13.4910

Ahora cámbialos en el bucle y sorpréndete

 
Alexandr Andreev:

Ahora intercámbielos en el bucle y se sorprenderá

No me sorprenderá. Sé que el compilador puede optimizar el código sobre la marcha

pero, en mi opinión, en los bucles anidados, todavía no debería llamar a ArraySize() innecesariamente.

for(int i = ArraySize(arr)-1; i >=0 ; i--)

Por supuesto, a veces puede ser inconveniente, así que hago el bucle a través de una variable temporal - su versión № 2

imho, es fiable y se entiende lo que va a pasar

 

Bueno, no puedo decir nada en contra de la IMHO.

En las repeticiones muy grandes, mis victorias se han vuelto aleatorias para el primer y segundo método... Lo más probable es que haya pasado a depender de la caché de la CPU y de la carga general.

Mi pregunta no era sobre el bucle, sino sobre cómo se desarrollaba la función. Sólo como ejemplo fue ArraySize

El resultado;

for (int i=0; i<ArraySIze(mas); i++) == for (int i=0; i<size; i++)


Pero si añadimos la inicialización de la variable de tamaño a la segunda parte, entonces el primer método se lleva la palma en el tiempo de inicializar esta variable y equipararla con el valor.

 

Si cambia el tamaño de las matrices en el cuerpo del bucle, la optimización sobre la marcha no funciona

así que cambia el código:

for(int loop=0; loop <5;loop++)
   {
   int cnt1 = ArrayResize(arr1, 100+loop);
   int cnt2 = ArrayResize(arr2, 200+loop);
   int cnt3 = ArrayResize(arr3, 300+loop);
   
   SpeedTest(3,"cnt",
.....

Alexandr Andreev:

entonces el primer método tiene preferencia, para el momento de inicializar esta variable y equipararla con un valor, se nota sólo en las altas repeticiones

no funciona

La optimización en tiempo de ejecución estará a la cabeza

no puedes probar mashidas tan simples sin el profiler, en general, puedes escribir en un bucle, o puedes probar en el tester, la velocidad es importante para ello