Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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 2ª
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
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
declaración incorrecta
probado: medición 1000 veces, 3 matrices y 3 bucles de fuerza bruta anidados en cada matriz, 2 variantes: 1ª y 2ª
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
entonces algunos problemas con el build....
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.
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:
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.
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.
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.
¿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.
Esto se probó hace mucho tiempo, por lo que sólo uso variables en los bucles.
Muéstrame una prueba con el código
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.