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

 
Igor Makanu:

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:

)))) simplemente también tiene que cambiar el valor de su variable de tamaño, por lo que el nombrado primer método utilizando ArraySIze beneficiará

 
Alexandr Andreev:

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. Es que se usó ArraySize como ejemplo.

Eso es bueno) La perfección de un lenguaje de alto nivel es precisamente cuando una entrada conveniente es tan barata como una entrada no conveniente pero inicialmente barata. Lástima que no siempre es así, y la ayuda con un ayudante para los novatos no siempre en absoluto tampoco..... no habría preguntas)))

 
Igor Makanu:

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:


no funciona

la optimización en tiempo de ejecución está a la cabeza

no puedes probar comandos tan simples de mashin sin un perfilador, o puedes escribir en el bucle, o probar en un probador, la velocidad es importante para ello.

No me refería al bucle sino a cómo el compilador despliega las funciones..... vamos.

Te dejo con ello.

 
Alexandr Andreev:

)))) también se le permite cambiar el valor de su variable de tamaño, por lo que el primer método que utiliza ArraySIze ganará

Escribí arriba - un código tan simple no puede ser probado con simples mediciones, hay muchos factores - el código es pequeño - cabrá en la caché del procesador, el código debe ser bien descompuesto en el procesador en micro-comandos paralelos en el pipeline del procesador, es decir, los registros serán cargados rápidamente por la precarga de datos

y tal vez rand() también se almacene en algún lugar


No sé cómo probar sin el depurador - al menos allí se puede ver el tiempo de ejecución de las instrucciones intactas

 
Alexandr Andreev:

Entonces demuestre que me equivoco).

Porque en mi prueba por alguna razón son iguales.

Cambié mi puesto.
Me parece que ArraySize ahora es más rápido que la variable cnt.
Antes era al revés. Tal vez el incremento cnt-- está afectando, el cuerpo del bucle es diferente y probablemente algo más debe ser inventado para la carga.

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < ArraySize(arr); i++) 
   {
      ArrayResize(arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:33:22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000000);  
   int cnt = ArraySize(arr);
   
   ulong t = GetMicrosecondCount();
   
   for(int i=0; i < cnt; i++) 
   {
      ArrayResize(arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount() - t;
   
   PrintFormat("Total time: %.3f ms", t / 1000.0);
}
2020.11.02 21:56:26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms
 
Roman:

Esto es extraño.
Eluso de ArraySize(arr) en la condición del bucle muestra menos tiempo que el uso de la variable cnt.
Antes era al revés. ¿Tal vez sea un error? No debería ser así.

No has mezclado nada en tu código, ¿quién va a cambiar el valor por ti?

cnt

cambiarlo por ti, como ocurre en la primera variante

 
void OnStart()
  {
   int mas[];
   int size=1000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100;
   uint t1=GetTickCount();
   int t=0;
   int tr=0; 
   MathSrand(10);
   for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r);// мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2=GetTickCount();
   for(ulong z=0; z<max; z++)
     {
     int v=size;
      for(ulong i=0; i<v; i++)
        { 
         r2+=rand();
         r--;
        }

     }

   uint t3=GetTickCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",t1," ",tr);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk(ulong &a){a++;}
void FunkRand(ulong &a){a+=rand();}

//+------------------------------------------------------------------+

Pregunta de 500p (sin comprobar), qué camino es más rápido. ver cuántas funciones externas se llaman en el método superior

Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

como una variante de la prueba - también puede deslizar sólo diferentes arrays en cada prueba - en mi ejemplo arr1,arr2...

es decir, tst1_arr1[],tst1_arr2[] .... y tst2_arr1[],tst2_arr2[]


esta sería una prueba más justa.

estoy fuera, muy distraído - imho, práctico, úsalo

 
Igor Makanu:

No sé cómo probar sin depurador - al menos puedes ver el tiempo de ejecución de las instrucciones en ciclos de reloj.

Pues sí, no se puede prescindir del depurador. Y en el tiempo del reloj allí...

 
Roman:

Esto es extraño.
Eluso de ArraySize(arr) en la condición del bucle muestra menos tiempo que el uso de la variable cnt.
Antes era al revés. ¿Tal vez sea un error? No debería ser así.

Ahí hay un resultado aleatorio. Al compilar, los accesos a una celda de memoria con un valor de tamaño de matriz se desdoblan, mientras que el tamaño de la matriz se recibirá y se pondrá en la celda de memoria de antemano, cuando se forme la matriz, incluso si la matriz es dinámica y las celdas con un tamaño de matriz y el valor de una variable tendrán el mismo tiempo de acceso.

Y a juzgar por la frase que hacen los compiladores en el curso de informática de 3-4 años... en general, espero que un nivel de encuadramiento suficientemente necesario no me ponga muy nervioso en un entorno de ACM)

Razón de la queja: