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

 
Alexandr Andreev:

El despliegue de las funciones normales es una cuestión de rutina

es decir, por ejemplo for (int i=0; i<ArraiSize(max); i++)

aquí ArraiSize(max); se expandirá y obtendrá algo así como la dirección al tamaño del array dado (si miramos el array, tiene su tamaño en una variable, y aquí tenemos la sustitución en esta variable "dirección en memoria") es decir, no tiene sentido cambiarlo a una variable, en absoluto

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<tamaño; i++ )

En este caso ArraiSize(max) y size tienen los mismos tiempos para determinar el tamaño del array

declaración incorrecta

probado: lo he probado 1000 veces, 3 arrays y 3 bucles anidados en cada array, 2 variantes: la 1ª y la

El resultado es estable (probado 3 veces):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

No veo el punto de discutir la metodología de las pruebas - muy largo y necesario
 
Roman:

En este bucle de ejemplo, no creo que esté de acuerdo con los tiempos.
Por el contrario, se recomienda obtener el resultado en la variable de tamaño y utilizarlo en la condición.
Ya que el bucle en cada iteración paraArraiSize(max) se desenrollará innecesariamente, ralentizando la ejecución del bucle.

La función ArraiSize(max) expande y devuelve la celda con el registro de longitud del array; se devuelvela dirección de la celda donde se almacena la longitud del array

y lo que es cualquier variable, en este caso el tamaño - es la direcciónde la celda donde se almacena la longitud del array

Así, obtenemos lo mismo a la salida y aunque cambiemos el tamaño del array en el proceso del bucle, la dirección por celda no cambiará ni en el primer caso ni en el segundo.

Como el valor mas es siempre estático (no es una referencia), simplemente no puede haber otra lógica))

La propia función ArraiSize(max), dice que se debe utilizar una sección de memoria en el arraymax para la longitud del array; esto se realiza en la etapa de compilación - despliegue de la función

 
Igor Makanu:

declaración incorrecta

probado: medición 1000 veces, 3 matrices y 3 bucles de fuerza bruta anidados en cada matriz, 2 variantes: y

El resultado es estable (probado 3 veces):

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

No veo el punto de discutir la metodología de las pruebas - muy largo y necesario

entonces algunos problemas con el build....

 
Alexandr Andreev:

entonces hay algunos problemas con el montaje....

Está claro que el resultado es el mismo.
Pero a esta sección de memoria se accederá de forma diferente, esa era la cuestión.
El acceso a una variable es más rápido que a una función, ya que la variable ya contiene el valor.
Y una función todavía necesita recuperar este valor y devolverlo, es decir, referirse a una celda de memoria, una instrucción innecesaria.

El ejemplo de Igor no es más que una confirmación de lo que decía.

 
Alexandr Andreev:

entonces algunos problemas con el montaje....

lied

ArraySize() se llama en cada iteración

incluso si no se comprueba el tamaño del array cada vez, se obtiene una llamada al procedimiento y al menos una comprobación de la variable que almacena el tamaño del array

esta es la prueba que estoy escribiendo, redimensionamos el array en el bucle, el bucle se interrumpe como debe ser, es decir, en cada iteración del bucle se determina el tamaño del array después de ejecutar el cuerpo del bucle:

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000);
   int cnt = 0;
   for(int i = 0; i < ArraySize(arr); i++)
   {
      ArrayResize(arr, sz--);
      cnt++;
   }
   printf("cnt = %i", cnt);   //cnt = 50001
}
 
Igor Makanu:

lied

ArraySize() se llama en cada iteración

aunque no se compruebe el tamaño de la matriz cada vez, se llama al procedimiento y al menos se comprueba la variable que almacena el tamaño de la matriz

Esta es la prueba que estoy escribiendo: redimensionamos el array en el bucle, el bucle se termina como se esperaba, es decir, en cada iteración del bucle se define el tamaño del array después de ejecutar el cuerpo del bucle:

Dame el código completo de tu prueba.

Romano:

Está claro que en la salida obtenemos lo mismo.
Pero este fragmento de memoria se obtendrá de manera diferente, eso es lo que quiero decir.

El ejemplo de Igor no es más que una confirmación de lo que decía.

Y tú mismo realizaste la prueba, estoy en 110000000000000000000 algo así no sucede.

Más concretamente, no lo tengo en ninguna prueba, ni siquiera aLONG_MAX repeticiones
 
Alexandr Andreev:

La función ArraiSize(max) se expande, toma una celda con el registro de la longitud del array y devuelve,la dirección de la celda donde se registra lalongitud del array

y lo que es cualquier variable, en este caso el tamaño - es la direcciónde la celda donde se almacena la longitud del array

Así, obtenemos lo mismo a la salida y aunque cambiemos el tamaño del array en el proceso del bucle, la dirección por celda no cambiará ni en el primer caso ni en el segundo.

Como el valor mas es siempre estático (no es una referencia), simplemente no puede haber otra lógica))

La propia función ArraiSize(max) dice que debemos utilizar un área de memoria en el arraymax responsable de la longitud del array y esto se ejecuta en la etapa de compilación - despliegue de la función

Esta opinión parece prematura. Se desconoce qué ocurre exactamente detrás de la función ArraiSize, ¿no es así? Es una caja negra en MQL. Es muy posible que for (int i=0; i<ArraiSize(max); i++) lleve a la ejecución de varias instrucciones. Por ejemplo, una función puede comprobar los parámetros de entrada. Guardar - empujar los datos fuera de la pila. Guarda los registros. Restaurar registros. Llamada de función - llamar y luego devolver. Lo que quiero decir es que pueden estar pasando muchas cosas en el fondo y no podemos verlas. Por eso es mejor usar for (int i=0; i<size; i++) y no confiar en que el compilador haga lo que esperamos que haga.

 
Alexandr Andreev:

¿Hiciste la prueba tú mismo, yo no la tengo en 110000000000000000000


Fue probado hace mucho tiempo, por eso sólo uso variables en los bucles.

 
Roman:

Esto se probó hace mucho tiempo, por lo que sólo uso variables en los bucles.

Muéstrame una prueba con el código

 
Alexandr Andreev:

Muéstrame el código de prueba

¿Qué prueba? ))
Tú mismo has mostrado las dos variantes de la condición del bucle.
Igor también dio el código anterior.
Sólo hay que medir la ejecución del bucle con la variable size y con ArraySize() en la condición del bucle.

Razón de la queja: