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

 
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=100000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2=r2/10;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
     {
      for(ulong i=0; i<v; i++)
        { 
        r1+=v;
        r1=r1/10;
        }
     }
   
   int pi2 = sum*step;
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r," ",r1," ",r2," ",pi," ",pi2);
// Templ();
  }

Aun así, el código superior a veces gana, pero muy raramente, es decir, el enlace es libre

 
Alexandr Andreev:

) bueno, no es así como funciona)


Así es como funciona en C++
En mql creo que es lo mismo pero con wrappers adicionales de MQ


Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

FAQ de principiantes MQL5 MT5 MetaTrader 5

Roman, 2019.12.11 14:02

No tienes que pensarlo bien, por qué debería... El compilador lo hará todo por sí mismo. ))
C# no es C

Echa un vistazo al vídeo sobre __inline.
Allí se explica cómo funcionan las funciones en la memoria para los que no hacen ninguna diferencia.


 
Roman:

Así es como funciona en C++
En mql creo que es lo mismo, pero con wrappers adicionales de MQ

Bueno, ahora releer este hilo y un montón de declaraciones y ejemplos de prueba - que hay alguna diferencia. Y lo encontramos)))

 
Alexandr Andreev:

Pues ahora relee este hilo y un montón de declaraciones y ejemplos de pruebas - que hay una diferencia. Y lo hicieron))))

No )) No tengo ningún deseo de releerlo.
Para mí es obvio que hay una diferencia.

 
Roman:

No )) No tengo ningún deseo de releerlo.
Para mí es obvio que hay una diferencia.

)))) otro IMHO.

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   int mas[];
   int mas1[300];
   int mas2[300];
   int mas3[300];
   int mas4[300];
   int mas5[300];
   int mas6[300];
   int z=300;
   int size=1000000000;
   ArrayResize(mas,size);
   ulong r=0;
   ulong r1=0;
   ulong r2=0;
   int random;
   ulong max=100; 
   int t=0;
   int tr=0; 
   MathSrand(10);
    int num_steps=ArraySize(mas);
    double x, pi, sum=0.0;
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
     
    
  // for(ulong z=0; z<max; z++)
     {
      for(int i=0; i<ArraySize(mas); i++)
        { 
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1);
        r2+=ArraySize(mas2);
        r2+=ArraySize(mas3);
        r2+=ArraySize(mas4);
        r2+=ArraySize(mas5);
        r2+=ArraySize(mas6);
        r2+=ArraySize(mas1); 
        r2++;
        r2=r2/100;
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r1++;
        r1=r1/100;
        r1++;
        
        }
     }
    
   ulong t3=GetMicrosecondCount();
   Print(t2-t1,"  ",t3-t2," ",r2," ",r1);
// Templ();
  }

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

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

La vía superior es más rápida en casi un 15% esto es muy significativo, bueno si todo es tan obvio explíquenmelo)


 
Alexandr Andreev:

)))) otro IMHO

La vía superior es más rápida en casi un 20%, bueno ya que todo es tan obvio explícamelo)


Los bucles que se comparan no son iguales en cuanto a código en el cuerpo.
El primer bucle tiene un código en el cuerpo, el cuerpo del segundo bucle tiene otro código.
Naturalmente, instrucciones de código diferentes, naturalmente, tiempo de ejecución diferente.
Haz el mismo código en el cuerpo del bucle y cambia sólo la condición del bucle ArraySize y la variable size.
Estamos probando esta parte, no el cuerpo.

 
Roman:

Los bucles que se comparan no son el mismo código en el cuerpo.
El primer bucle tiene un código en su cuerpo y el cuerpo del segundo bucle tiene otro código.
Naturalmente, las instrucciones del código y el tiempo de ejecución son diferentes.
Haz el mismo código en el cuerpo del bucle y cambia sólo la condición del bucle ArraySize y la variable size.
Estamos probando esta parte, no el cuerpo.

Tu prueba es más incorrecta porque depende del caso de lanzamiento, ejecútala de nuevo. En ambos casos hay un incremento y una división. Bueno, además hay un par de decenas~ miles de millones adicionales de llamadas a ArraySize en la parte superior.

Por cierto, es en el cuerpo donde debemos escribir lo que estamos probando. Porque es el cuerpo el que se repite. Estamos tratando de envolverlo en loop.... para obtener un resultado es decir, originalmente era necesariollamar a ArraySize desde el cuerpo

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 
Alexandr Andreev:

Tu prueba es más incorrecta ya que depende del caso de lanzamiento, ejecútala de nuevo. Aquí ambos casos tienen un incremento y una división. Bueno, además hay un par de decenas~ miles de millones de llamadas ArraySize en la parte superior.

Por cierto, es en el cuerpo donde debemos escribir lo que estamos probando. Porque es el cuerpo el que se repite. Estamos tratando de envolverlo en loop.... para obtener un resultado es decir, inicialmente era necesariollamar a ArraySize desde el cuerpo

En cada iteración, la condición del bucle ya contiene una comprobación de la condición i<ArraySize() o i<size
, es decir, en cada iteración se llama a una función o a una variable.
¿Por qué debemos introducir el objeto que se está probando en el cuerpo?

La propia lógica nos lleva a decidir cuál será más rápido de manejar. A una función o a una variable.
No me importa cómo lo llame el compilador. No confío en el compilador, sólo utilizo mi sentido común para averiguar qué es más rápido de manejar desde el punto de vista de la referencia.

 
Roman:

En cada iteración, en la condición del bucle, se comprueba de todas formas la condición i<ArraySize() o i<size
, lo que significa que en cada iteración se accede a una función o a una variable.
¿Por qué hay que poner el objeto que se examina en el cuerpo?

Porque somos los afortunados que tenemos esta función y la función puede ser cualquier otra. Y se coloca exactamente en el cuerpo. Sólo lo he duplicado para intentar potenciar su efecto y abordar diferentes matrices.

Pero es un error añadir tareas más complejas, cuyo error de cálculo puede eclipsar el efecto estudiado. Por cierto también es posible que el montaje no es constante en μl. es decir, cuando la recompilación puede obtener datos ligeramente diferentes (aunque esto no es exacto, pero es una especie de protección contra la piratería) Así que todo puede ser probado en su código para usted. Vea si los resultados cambian.

Mcl simplemente intenta sustituir el código como se indica en el vídeo. Bueno, es un poco diferente allí. Pero en términos generales.

Y esas instrucciones para las funciones que no saben qué valor van a obtener - así es como funcionan js y php y otros lenguajes similares, incluso µl funciona así pero sólo en modo debug

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о запущенной MQL5-программе
  • www.mql5.com
Информация о запущенной MQL5-программе - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Roman:

En cada iteración, en la condición del bucle, se comprueba de todas formas la condición i<ArraySize() o i<size
, lo que significa que en cada iteración se accede a una función o a una variable.
¿Por qué debemos introducir el objeto que se está probando en el cuerpo?

La propia lógica nos lleva a decidir cuál será más rápido de manejar. A una función o a una variable.
No me importa cómo lo llame el compilador. No confío en el compilador, sino en el sentido común y en averiguar qué es más rápido de manejar desde el punto de vista de la referencia.

No siempre funciona.

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

Pregunta para los expertos en #define

Roman, 2020.11.02 19:44

Cambié mi puesto.
Es al revés, es decir, ArraySize es más rápido ahora que cnt.
Antes era al revés. Tal vez el incremento de cnt-- afecta, 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