Obtener el número de decimales de cualquier número (no sólo las comillas) evitando Digits() en MQL4 y MQL5 - página 15

 
Igor Makanu:

si ArrayCopy() se realiza de la misma manera que Cysh memmove(),

Creo que la velocidad de ArrayCopy() depende de la velocidad de asignación de la memoria, si la memoria intermedia del buffer está lista para ser copiada, ArrayCopy() se ejecutará muy rápidamente, si la memoria no está asignada, empezará a solicitar al sistema operativo que asigne memoria

puedes intentar probarlo - haz una llamada a ArrayCopy() con un volumen de datos grande, preparando así la memoria intermedia para el intercambio, y luego haz un bucle con ArrayCopy() con un volumen de datos más pequeño a copiar y luego mide la velocidad

En nuestro ejemplo actual, la copia se ejecuta en un array estático, pero en general es interesante, por supuesto, cuando ArrayCopy es más lento que un simple for. Si necesitas asignar memoria, tendrás que hacerlo de todos modos, no importa cómo lo hagas.

 
Ilya Malev:

En nuestro ejemplo actual, la copia se realiza en un array estático, pero en general es interesante, por supuesto, cuando ArrayCopy es más lento que el simple for. Si necesitamos asignar memoria, tendremos que hacerlo de todos modos.

No importa si es estático o dinámico, no sabemos cómo se implementa ArrayCopy(), sólo asumí que es una "envoltura" sobre las funciones estándar de Cish, memmove() suele funcionar a través de un buffer adicional... bueno, como siempre, así es como se escribía antes, es difícil saber cómo y qué compilador funciona

SZY: Es que no sé cómo probar el tiempo de ejecución en MQL ((( - Lo he intentado un par de veces, creo que he tomado ejemplos de la ayuda, los resultados son de alguna manera muy diferentes, y he ignorado esta pregunta por necesidad - no pruebo el rendimiento, suelo mirar en el perfilador, qué y cómo se ejecuta en el tiempo

 
Igor Makanu:

Es que no sé cómo probar la velocidad de ejecución en MQL ((( - Lo intenté un par de veces, creo que tomé ejemplos de la ayuda, pero los resultados fueron muy diferentes por alguna razón, así que desistí de este tema porque no pruebo el rendimiento, suelo usar el perfilador para ver cómo y qué se ejecuta en el tiempo

esta es la forma más fácil, que he utilizado arriba

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

Esta es la forma más fácil que he utilizado arriba


Gracias, lo tengo, lo probaré mañana

 
Ilya Malev:

Sí, esto funcionará mucho más rápido (sustituido en lo posible por ArrayCopy, el resto es lo mismo):

Ya te dije que escribí lo primero que se me ocurrió sin hacer pruebas))

Esta variante no es diferente de la mía. Las mediciones (tiempo mínimo de 10 intentos) lo demuestran.

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

Puedes ver que la variante con ciclo es más rápida, porque el ciclo de 60 /4 = 15 elementos.

Archivos adjuntos:
 
fxsaber:

Esta variante no es diferente de la mía.

Aparentemente sí, sólo el tipo de estructura y el tipo de matriz son arbitrarios.

 
fxsaber:

Puedes ver que la variante del bucle es más rápida, porque el bucle de 60 /4 = 15 elementos.

Extrañamente, conseguí ser más rápido que ArrayCopy con los mismos MqlTicks e int...

 
Ilya Malev:

Extrañamente, obtuve más rápido que ArrayCopy con los mismos MqlTicks e int...

Lo estoy ejecutando en MT5x64.

Ilya Malev:

Aparentemente, sí, pero el tipo de estructura y el tipo de matriz son arbitrarios.

He evitado a propósito el caso común para permitir la participación de más personas.


Hasta ahora

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

Funcionando en MT5x64.

Se ha obviado el caso general para que puedan participar más personas.


Hasta ahora.

Supongo que tu código ya es más rápido :)

Tengo que añadir un montón de código de servicio allí para mejorar la funcionalidad de ArrayCopy (inicio de origen, inicio de destino, recuento) y comprobar los parámetros para que sean correctos...

En general, tenéis tantas obras/bibliotecas chulas que es extraño que preguntéis y discutáis la mejor solución en el foro :)

 
Ilya Malev:

Es extraño que preguntes y discutas la mejor solución en el foro :)

Necesito uno para la biblioteca de HistoryTicks. Gracias por participar.