Acerca del perfilador de código de MT5 - página 2

 
Ilyas :

La captura de pantalla muestra las estadísticas de la cadena de llamada y no de la función SymbolInfoTick.

En total, la cadena dada se midió 210 veces, una vez que se "paró" exactamente en la cadena, antes de la llamada SymbolInfoTick o justo después, y 209 veces como la cadena de retorno de SymbolInfoTick

Lo siento, pero no está claro.

El resumen del perfil dice:

SymbolInfoTick () Total CPU: 209 (0,83%)

El propio código dice:

SymbolInfoTick () Total CPU: 210 (2,57%)

SymbolInfoTick () ocurre sólo UNA vez en el código. No está nada claro cuáles son estos valores diferentes. OK, 209 vs 210, dices que es porque "paró" uno en esa línea (no tiene sentido para mí, pero supongo que no importa mucho).

¿Qué pasa con el %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Mediciones totales 25039, 0/0 errores, 99 MB de memoria de pila analizados (92872/1073741824)

Así que 209 (0,83%) significa 100% = 25039. OK

Pero 210 (2,57%) significa 100% = 8171? ¿Qué es el 8171 para la CPU total?

 
Alain Verleyen :

¿Qué hay de esto ( post #1 )?

Como puede ver, SymbolInfoTick () se muestra como la parte más difícil del código. Lo cual es incorrecto. Este es el mismo código que en los siguientes posts (que muestra SymbolInfoTick con Total CPU = 209 (0.83%), lo cual es correcto), la diferencia es que comenté la línea donde SymbolInfoTick () era Total CPU = 1. El tiempo total de ejecución (según los datos históricos) no cambió con este ligero cambio, pero los resultados del perfilador fueron diferentes.

Puedo proporcionar el código en privado si quieres comprobarlo.

О профилировщике кода MT5
О профилировщике кода MT5
  • 2021.07.09
  • www.mql5.com
Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать...
 
Alain Verleyen:

Lo siento, pero no está claro.

El resumen del perfil dice:

SymbolInfoTick () Total CPU: 209 (0,83%)

El propio código dice:

SymbolInfoTick () Total CPU: 210 (2,57%)

SymbolInfoTick () ocurre sólo UNA vez en el código. No está nada claro cuáles son estos valores diferentes. OK, 209 vs 210, dices que es porque "paró" uno en esa línea (no tiene sentido para mí, pero supongo que no importa mucho).

¿Qué pasa con el %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Mediciones totales 25039, 0/0 errores, 99 MB de memoria de pila analizados (92872/1073741824)

Así que 209 (0,83%) significa 100% = 25039. OK

Pero 210 (2,57%) significa 100% = 8171? ¿Qué es el 8171 para la CPU total?

Está comparando las estadísticas de "línea de código" y de "función"

Hay una línea de código

       if (! SymbolInfoTick (symbolф,tickф))     // Total CPU : 210 (2.57%)  Self CPU : 1 (1.49%)

Esta cadena se incluyó en las estadísticas un total de 210 veces:

  • 209 veces como línea de código desde la que se llama a SymbolInfoTick
  • 1 vez como si el operador

Hay una función SymbolInfoTick, esta función golpea las estadísticas 209 veces.
La función sólo se llama desde esta línea de código, quizás por eso te confundiste con los contadores


En cuanto a los números:
Así, 209 (0,83%) significa 100% = 25039. OK

no lo es, los números son simplemente similares: 209 / 0,83 * 100 = 25180


Pero 210 (2,57%) significa 100% = 8171? ¿Qué es el 8171 para la CPU total?

Correcto, de 25039 mediciones, 8171 de ellas provienen de la línea de código con la llamada SymbolInfoTick

 

Alain Verleyen:

prueba de espalda se ejecuta en:

2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 ticks, 998 barras generadas. La prueba se ha superado en 0: 03: 09,367 (incluyendo el preprocesamiento de los ticks 0: 00: 00,515).

He añadido código para medir el tiempo de ejecución de SymbolInfoTick () utilizando GetMicrosecondCount ().

       ulong start= GetMicrosecondCount ();

       //--- Get tick information
       if (! SymbolInfoTick (symbol,tick))
         return ( false );

      BENCH += GetMicrosecondCount ()-start;

Resultado:

2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Ejecutado = 836973 en 661874 microsegundos

Así, SymbolInfoTick () tardó un total de 661 milisegundos en los datos históricos en 3 minutos y 9 segundos. Sin embargo, el perfilador muestra que utiliza el 74,71% de las medidas. No entiendo hasta qué punto esto es preciso o útil.


Que quede claro, las pruebas no consisten únicamente en ejecutar el código MQL + el perfilador, al capturar las estadísticas, ralentiza un poco la ejecución.


Dicho esto, en el informe, el 74,71% es una cifra relativa al código MQL, no a las pruebas en general

 

¡Hola @Ilyas!

Gracias. Volveré a comprobarlo con sus respuestas y les mantendré informados.

 
Ilyas:
...

En cuanto a los números:

no lo es, los números son simplemente similares: 209 / 0,83 * 100 = 25180


Correcto, de 25039 mediciones, 8171 de ellas provienen de la línea de código con la llamada SymbolInfoTick

Me equivoqué con los números.

En efecto, 209 es el 0,83469% de 25039, que se redondeó al 0,83


Se tomaron 8171 muestras en la línea con SymbolInfoTick llamada 210 veces, es decir, el 2,57%.

 
Ilyas :

Me equivoqué con los números.

En efecto, 209 es el 0,83469% de 25039 redondeado a 0,83


8171 ejecuciones se produjeron en una rama de ejecución del programa en la que la línea que llama a SymbolInfoTick se ejecutó 210 veces, lo que supone un 2,57%.

Ejecución de OnTimer (), por lo que no está muy claro por qué es 8171? Cuando OnTimer () Total CPU muestra 29683.
 
Alain Verleyen:
Ejecución de OnTimer (), por lo que no está muy claro por qué es 8171? Cuando OnTimer () Total CPU muestra 29683.

Por favor, proporcione el código, voy a volver a comprobar el funcionamiento de los contadores

 
Ilyas :

Por favor, proporcione el código, voy a volver a comprobar el funcionamiento de los contadores

Lo haré en privado en cuanto tenga tiempo. Gracias.
 
Ilyas:

Ilyas, ayúdame a resolver esto también.

1. ¿Por qué una llamada a una función vacía puede ocupar el 34,5% de la CPU propia? Al mismo tiempo, la llamada de la función que le sigue, cuyos internos ocupan el 38,16% del total de la CPU, no aparece en el informe en absoluto...


Código de función:



2. Este ejemplo muestra el segundo problema: la línea con TimeCurrent() tarda un tiempo excesivo no sólo dentro de la función sino en el programa en general:

Antes de comentar el cuerpo de CheckTimeSeries(), la carga principal estaba en su línea TimeCurrent().

¿Es realmente una función tan pesada? ¿Con qué sustituirlo? ¿O cómo hacer que sea económico (caché dentro de un bucle de ejecución del programa)?

Siempre que puedo, me ahorro los cálculos adelgazándolos (una vez por barra, una vez cada X segundos, una vez cada Y ms, etc.). Pero resulta que la comprobación en sí, ya sea para hacer los cálculos, consume bastantes recursos.


Gracias por la ayuda.

Razón de la queja: