Informazioni sul profilatore di codice MT5 - pagina 2

 
Ilyas :

La schermata mostra le statistiche per la stringa di chiamata e non la funzione SymbolInfoTick.

In totale, la stringa data è stata misurata 210 volte, una volta "fermata" esattamente sulla stringa, prima della chiamata SymbolInfoTick o subito dopo, e 209 volte come stringa di ritorno da SymbolInfoTick

Scusa, ma non è chiaro.

Il riassunto del profiler dice:

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

Il codice stesso dice:

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

SymbolInfoTick () si verifica solo UNA volta nel codice. Quali siano questi diversi valori non è affatto chiaro. OK, 209 vs 210, hai detto che è perché ha "fermato" uno su quella linea (non ha senso per me, ma immagino che non abbia molta importanza).

E la %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Misure totali 25039, 0/0 errori, 99 MB di memoria stack analizzata (92872/1073741824)

Quindi 209 (0,83%) significa 100% = 25039. OK

Ma 210 (2,57%) significa 100% = 8171?!? Cos'è 8171 per la CPU totale?

 
Alain Verleyen :

Che dire di questo ( post #1 )?

Come potete vedere, SymbolInfoTick () è mostrato come la parte più difficile del codice. Il che non è corretto. Questo è lo stesso codice come nei post seguenti (che mostra SymbolInfoTick con Total CPU = 209 (0,83%), che è corretto), la differenza è che ho commentato la linea dove SymbolInfoTick () era Total CPU = 1. Il tempo totale di esecuzione (secondo i dati storici) non è cambiato con questo leggero cambiamento, ma i risultati del profiler erano diversi.

Posso fornire il codice in privato se volete controllare.

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

Mi dispiace, ma non è chiaro.

Il riassunto del profiler dice:

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

Il codice stesso dice:

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

SymbolInfoTick () si verifica solo UNA volta nel codice. Quali siano questi diversi valori non è affatto chiaro. OK, 209 vs 210, hai detto che è perché ha "fermato" uno su quella linea (non ha senso per me, ma immagino che non abbia molta importanza).

E la %?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Misure totali 25039, 0/0 errori, 99 MB di memoria stack analizzata (92872/1073741824)

Quindi 209 (0,83%) significa 100% = 25039. OK

Ma 210 (2,57%) significa 100% = 8171?!? Cos'è 8171 per la CPU totale?

State confrontando le statistiche per "linea di codice" e per "funzione"

C'è una linea di codice

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

Un totale di 210 volte questa stringa è stata inclusa nelle statistiche:

  • 209 volte come linea di codice da cui SymbolInfoTick è chiamato
  • 1 volta come se l'operatore

C'è una funzione SymbolInfoTick, questa funzione ha colpito le statistiche 209 volte.
La funzione è chiamata solo da questa linea di codice, forse è per questo che ti sei confuso con i contatori


Per quanto riguarda i numeri:
Quindi, 209 (0,83%) significa 100% = 25039. OK

non lo è, i numeri sono solo simili: 209 / 0,83 * 100 = 25180


Ma 210 (2,57%) significa 100% = 8171?!? Cos'è 8171 per la CPU totale?

Corretto, su 25039 misurazioni, 8171 di esse provengono dalla linea di codice con la chiamata SymbolInfoTick

 

Alain Verleyen:

Backtest in esecuzione a:

2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 ticks, 998 barre generate. Il test è passato in 0: 03: 09.367 (compresa la pre-elaborazione dei tick 0: 00: 00.515).

Ho aggiunto del codice per misurare il tempo di esecuzione di SymbolInfoTick () usando GetMicrosecondCount ().

       ulong start= GetMicrosecondCount ();

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

      BENCH += GetMicrosecondCount ()-start;

Risultato:

2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Totale = 1209572 Eseguito = 836973 in 661874 microsecondi

Così, SymbolInfoTick () ha preso un totale di 661 millisecondi sui dati storici in 3 minuti e 9 secondi. Tuttavia, il profiler mostra che utilizza il 74,71% delle misure. Non capisco quanto questo sia accurato o utile.


Sia chiaro, i test non riguardano solo l'esecuzione del codice MQL + il profiler, catturando le statistiche, rallenta un po' l'esecuzione.


Detto questo, nel rapporto, il 74,71% è una cifra relativa al codice MQL, non ai test in generale

 

Ciao @Ilyas!

Grazie. Controllerò di nuovo con le vostre risposte e vi terrò informati.

 
Ilyas:
...

Per quanto riguarda i numeri:

non lo è, i numeri sono solo simili: 209 / 0,83 * 100 = 25180


Corretto, su 25039 misurazioni, 8171 di esse provengono dalla linea di codice con la chiamata SymbolInfoTick

Ho sbagliato i numeri.

Infatti, 209 è lo 0,83469% di 25039, che è stato arrotondato allo 0,83


8171 campioni sono stati presi sulla linea con SymbolInfoTick chiamato 210 volte, cioè il 2,57%.

 
Ilyas :

Ho sbagliato i numeri.

Infatti, 209 è lo 0,83469% di 25039 arrotondato allo 0,83


8171 esecuzioni erano su un ramo dell'esecuzione del programma in cui la linea che chiama SymbolInfoTick è stata eseguita 210 volte, cioè il 2,57%.

Esecuzione da OnTimer (), quindi non è del tutto chiaro perché è 8171? Quando OnTimer () Total CPU mostra 29683.
 
Alain Verleyen:
Esecuzione da OnTimer (), quindi non è del tutto chiaro perché è 8171? Quando OnTimer () Total CPU mostra 29683.

Si prega di fornire il codice, controllerò due volte il funzionamento dei contatori

 
Ilyas :

Si prega di fornire il codice, controllerò due volte il funzionamento dei contatori

Lo farò in privato appena avrò tempo. Grazie.
 
Ilyas:

Ilyas, aiutami a capire anche questo.

1. Perché una chiamata di funzione vuota può richiedere il 34,5% della CPU di Self? Allo stesso tempo, la chiamata della funzione che la segue, i cui interni occupano il 38,16% della CPU totale, non appare affatto nel rapporto?


Codice di funzione:



2. Questo esempio mostra il secondo problema: la linea con TimeCurrent() impiega un tempo irragionevolmente lungo non solo all'interno della funzione ma nel programma in generale:

Prima di commentare il corpo di CheckTimeSeries(), il carico principale era sulla sua linea TimeCurrent().

È davvero una funzione così pesante? Con cosa sostituirlo? O come renderlo economico (caching all'interno di un ciclo di esecuzione del programma)?

Ovunque posso, risparmio i calcoli diluendoli (una volta per barra, una volta ogni X secondi, una volta ogni Y ms, ecc.) Ma si scopre che il controllo stesso, se per fare i calcoli, è abbastanza intensivo in termini di risorse.


Grazie per l'aiuto.