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

 
Igor Makanu:

si físicamente en el comando de la CPU, no

un array es una zona de memoria, el acceso a los elementos del array consiste en calcular el índice de un elemento desde el principio de esta zona de memoria y recuperar los datos (bytes) según el tipo almacenado


si esta es la lógica del algoritmo, entonces sí, son variables indexadas.

en general sobre el problema en estudio, el único consejo correcto es https://www.mql5.com/ru/forum/354662/page4#comment_19039624:

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

El tiempo de ejecución de una operación binaria es muchas veces más rápido que el tiempo de ejecución de una sentencia if (debería serlo) .... Parece que detrás de las escenas ya sea limpio o super rápido código nativo

El tiempo del de arriba es la mitad del de abajo.


Bueno, técnicamente estábamos comparando dos variables))

 
Alexandr Andreev:

El tiempo de ejecución de una operación binaria es muchas veces más rápido que el tiempo de ejecución de una sentencia if (debería ser así) ....

no debería haber if() en los bucles, antes el bucle era ejecutado por el registro CX

Alexandr Andreev:

El tiempo de la superior es la mitad que el de la inferior

No estoy discutiendo, estuve probando de nuevo por la mañana, la optimización de tiempo siempre funciona en MQL5, el resultado depende del número de bucles, bueno que prueba se llamó primero - no voy a probar de nuevo, es una pérdida de tiempo

 
Igor Makanu:

no debería haber ningún if() en los bucles, antes de que el bucle fuera ejecutado por CX case

No estoy discutiendo, estuve probando de nuevo en la mañana, la optimización de tiempo siempre funciona en MQL5, el resultado depende del número de bucles, bueno, que prueba se llamó primero, no voy a probar de nuevo, es una pérdida de tiempo

.... Tienes que vigilar tus posts)))) el post de arriba se refiere al post que sugería que el operador ArraySize comprueba los desbordamientos (ESTE es tu si) y es añadiéndolo al cuerpo que realmente se comprueba, y esta es la única forma correcta.

Y la diferencia con respecto a la ejecución de la primera es sólo en sus pruebas)

 
Alexandr Andreev:

Y la única diferencia con respecto a la ejecución de la primera es en sus pruebas)

Dame tu prueba, vamos a ver.

aunque... No hace falta, estoy participando en la discusión sobre el automatismo, a ti te gusta, yo soy de otra opinión sobre el uso de ArraySize() en la condición de finalización del bucle

 

Dimensiones del .ex5

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
¿Quién lo sabe, aparte de los fabricantes de compiladores? Tal vez ArraySize() funcione igual que una referencia a una variable. Parece posible.
 
Dmitry Fedoseev:
¿Y quién sabe sino los creadores del compilador? Tal vez ArraySize() funcione igual que el direccionamiento de una variable. Parece posible.
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

Tenga en cuenta que aquí la prueba entre la función que llama a la función que llama ArraySize y la velocidad es la misma, lo que para acceder a sólo una variable. Porque el compilador sólo los despliega

ArraySize

de usar ArraySize() en la condición de terminación del bucle


y no hay ninguna diferencia con la reordenación de
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

otra prueba de the_bald....

¿Por qué pruebas tu creación una vez?

pruébalo al menos diez veces para ver qué pasa

envuelto en código de bucle externo, resultado:

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

No voy a reorganizar los bucles probados, me aburrí con ellos - el tamaño del código por encima, significa una buena optimización, tal vez con el analizador de código, el año pasado me sorprendió, en la optimización iCustom para MQL4 - 4 llamadas de 4=x búferes indicadores se sustituyen por una llamada , había un tema en alguna parte, de nuevo sobre la eficiencia

en general, Metacquotes hizo un buen trabajo en el análisis de los códigos de tipo de los usuarios, es decir, el compilador arreglará la mayoría de las cosas de los usuarios por sí mismo... ¡genial, imho!

 

Lo siento, podría estar equivocado. No lo he leído todo. Sólo la primera página. La impresión es la habitual. Alguien hace una pregunta concreta. Y entonces llegan los inundadores en picado.

Lo siento de nuevo, ¿es esto realmente un foro de desarrolladores ?????

 
Сергей Таболин:

Lo siento, podría estar equivocado. No lo he leído todo. Sólo la primera página. La impresión es la habitual. Alguien hace una pregunta concreta. Y entonces llegan los inundadores en picado.

Lo siento de nuevo, ¿es esto realmente un foro de desarrolladores ?????

Error, allí también se plantearon otras cuestiones diferentes a las de TC. Y entender los principios de la compilación a veces ayuda.