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

 
Nikolai Semko:
En la carretera por ahora. Puedes probarlo tú mismo. La idea es utilizar uniones con matrices de estructuras de diferentes tamaños, por ejemplo, 10, 100, 1000, 10000...
Esto acortará el bucle en órdenes de magnitud y reducirá el número de llamadas a ArrayCopy en órdenes de magnitud.
Esto debería estar cerca de la variante de la memcopia.

Se utilizó esta idea. En este caso

Puedes ver todo en el código fuente.
 
fxsaber:

Se utilizó esta idea. Al hacerlo

Puedes ver todo en el libro de consulta.
Sí, lo he buscado. Es extraño que no tenga ningún efecto.
 
Nikolai Semko:
Sí, lo he buscado. Es extraño que no tenga ningún efecto.

Hay una línea en la fuente que controla el tamaño

#define  CONVERT_AMOUNT 128

Puedes cambiar este valor y ver el resultado. Si el valor es superior a cien, la velocidad no aumenta. En realidad, es fácil de explicar, porque en total se copian el mismo número de elementos. Además, se eliminan los retrasos asociados a las pequeñas porciones de copia.

 
fxsaber:

Me temo que ya estamos encerrados en el máximo rendimiento.

Sí, estoy de acuerdo.
Lo he probado - el mismo resultado que en su TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4

 
Andrey Khatimlianskii:

Tienes el código fuente, puedes medirlo tú mismo.

Así que mídelo. Estoy bastante seguro de que no, así que no veo el sentido de perder el tiempo ni en el artículo ni en la medición.

 
fxsaber:

Me temo que ya estamos al límite del rendimiento.

Para ser honesto, estoy muy sorprendido de que hayan logrado acercarse tanto a memcpy. Simplemente no puede ser. Algo no está bien.

 
fxsaber:

Me temo que ya estamos atascados con el máximo rendimiento.

Creo entender un grave error de cálculo tuyo.
Su BANCO selecciona el mínimo de 50 carreras absolutamente idénticas.
Pero el compilador es un gran listillo y perezoso. No hará el mismo trabajo 50 veces y optimizará el código. Por eso deberías cambiar al menos las matrices en cada ejecución. O puede sustituir 50 por 1 y aumentar el número de pruebas. Entonces los resultados serán muy diferentes y más objetivos.

2018.12.09 13:55:43.048 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12.09 13:55:43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12.09 13:55:43.296 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 247579
2018.12.09 13:55:43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12.09 13:55:43.544 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 247840
2018.12.09 13:55:43.634 StructToArray__2        true
2018.12.09 13:55:43.766 StructToArray__2        
2018.12.09 13:55:43.766 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12.09 13:55:44.118 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 351847
2018.12.09 13:55:44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12.09 13:55:44.452 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 334011
2018.12.09 13:55:44.548 StructToArray__2        true
2018.12.09 13:55:44.692 StructToArray__2        
2018.12.09 13:55:44.692 StructToArray__2        https://www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12.09 13:55:44.692 StructToArray__2        TicksToIntArray_semko
2018.12.09 13:55:45.037 StructToArray__2        Time[TicksToIntArray(TicksIn,Array)] = 344707
2018.12.09 13:55:45.037 StructToArray__2        IntArrayToTicks_semko
2018.12.09 13:55:45.373 StructToArray__2        Time[IntArrayToTicks(Array,TicksOut)] = 336193
2018.12.09 13:55:45.462 StructToArray__2        true

Cuando la diferencia respecto a memcpy es del 40% es más plausible

Me pregunto si comprimir la matriz tendrá algún efecto. Una matriz de ticks puede comprimirse por un factor de 10-12. La única pregunta es si esto ahorrará el tiempo resultante en el envío y la recepción a través del recurso.

Archivos adjuntos:
 
Nikolai Semko:

Creo entender un error de cálculo muy grave tuyo.
Tu BANCO selecciona el mínimo de 50 ejecuciones absolutamente idénticas.
Pero el compilador es un gran listillo y perezoso. No hará el mismo trabajo 50 veces, sino que optimizará el código.

El código está escrito de tal manera que hará exactamente lo que se supone que debe hacer. El compilador no podrá afectar a la velocidad de memcpy, pero los resultados de los pases son los siguientes

Un bucle de una pasada

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 192509
true


De 50

https://www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time[TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time[IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber:

El código está escrito de tal manera que hará exactamente lo que quieres que haga. El compilador no puede afectar la velocidad de memcpy, pero los resultados de las pasadas son

Un bucle de una pasada


De 50.

Pero entonces, ¿por qué ocurre esto? Por supuesto, el compilador no puede afectar al proceso de ejecución de memcpy, pero puede negarse a ejecutarlo, tirando de los resultados prealmacenados del primer cálculo, si entiende que ninguno de los parámetros calculados cambia durante el bucle. Así es como yo mismo organizaría el compilador para arreglar los alogismos del programa.
 
Ilya Malev:

Así que mídelo. Estoy bastante seguro de que no, así que no veo el sentido de perder el tiempo ni en el artículo ni en la medición.

No tengo que hacerlo.