À propos du profileur de code MT5 - page 2

 
Ilyas :

La capture d'écran montre les statistiques pour la chaîne d'appel et non pour la fonction SymbolInfoTick.

Au total, la chaîne donnée a été mesurée 210 fois, une fois "arrêtée" exactement à la chaîne, avant l'appel de SymbolInfoTick ou juste après, et 209 fois comme chaîne de retour de SymbolInfoTick.

Désolé, mais ce n'est pas clair.

Le résumé du profiler dit :

SymbolInfoTick () Total CPU : 209 (0.83%)

Le code lui-même dit :

SymbolInfoTick () Total CPU : 210 (2.57%)

SymbolInfoTick () n'apparaît qu'UNE seule fois dans le code. Ce que sont ces différentes valeurs n'est pas du tout clair. OK, 209 vs 210, vous avez dit que c'est parce qu'il en a "arrêté" un sur cette ligne (ça n'a pas de sens pour moi, mais je suppose que ça n'a pas beaucoup d'importance).

Et le pourcentage ?

0 2021.07.10 11 : 52 : 19.032 MQL5 Profiler Mesures totales 25039, 0/0 erreurs, 99 MB de mémoire de pile analysée (92872/1073741824)

Donc 209 (0,83%) signifie 100% = 25039. OK

Mais 210 (2,57%) signifie 100% = 8171 ?!? Que signifie 8171 pour Total CPU ?

 
Alain Verleyen :

Qu'en est-il de ceci ( post #1 ) ?

Comme vous pouvez le voir, SymbolInfoTick () apparaît comme la partie la plus difficile du code. Ce qui est incorrect. C'est le même code que dans les posts suivants (qui montre SymbolInfoTick avec Total CPU = 209 (0.83%), ce qui est correct), la différence est que j'ai commenté la ligne où SymbolInfoTick () était Total CPU = 1. Le temps d'exécution total (selon les données historiques) n'a pas changé avec cette légère modification, mais les résultats du profileur étaient différents.

Je peux fournir le code en privé si vous voulez vérifier.

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

Je suis désolé, mais ce n'est pas clair.

Le résumé du profiler dit :

SymbolInfoTick () Total CPU : 209 (0.83%)

Le code lui-même dit :

SymbolInfoTick () Total CPU : 210 (2.57%)

SymbolInfoTick () n'apparaît qu'UNE seule fois dans le code. Ce que sont ces différentes valeurs n'est pas du tout clair. OK, 209 vs 210, vous avez dit que c'est parce qu'il en a "arrêté" un sur cette ligne (ça n'a pas de sens pour moi, mais je suppose que ça n'a pas beaucoup d'importance).

Et le pourcentage ?

0 2021.07.10 11 : 52 : 19.032 MQL5 Profiler Mesures totales 25039, 0/0 erreurs, 99 MB de mémoire de pile analysée (92872/1073741824)

Donc 209 (0,83%) signifie 100% = 25039. OK

Mais 210 (2,57%) signifie 100% = 8171 ?!? Que signifie 8171 pour Total CPU ?

Vous comparez les statistiques pour la "ligne de code" et pour la "fonction"

Il y a une ligne de code

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

Au total, cette chaîne a été incluse 210 fois dans les statistiques :

  • 209 fois comme une ligne de code à partir de laquelle SymbolInfoTick est appelé
  • 1 fois comme si l'opérateur

Il y a une fonction SymbolInfoTick, cette fonction a touché les statistiques 209 fois.
La fonction n'est appelée qu'à partir de cette ligne de code, c'est peut-être pour cela que vous avez confondu avec les compteurs


. Quant aux chiffres :
.
Donc, 209 (0,83%) signifie 100% = 25039. OK

ce n'est pas le cas, les chiffres sont juste similaires : 209 / 0,83 * 100 = 25180


Mais 210 (2,57%) signifie 100% = 8171 ?!? Que signifie 8171 pour Total CPU ?

Correct, sur 25039 mesures, 8171 d'entre elles proviennent de la ligne de code avec l'appel SymbolInfoTick

 

Alain Verleyen:

Backtest en cours à :

2021.07.10 08:00 : 37.101 Core 01 EURUSD, H1 : 230861 ticks, 998 barres générées. Le test a réussi en 0 : 03 : 09.367 (y compris le prétraitement des ticks 0 : 00 : 00.515).

J'ai ajouté du code pour mesurer le temps d'exécution de SymbolInfoTick () en utilisant GetMicrosecondCount ().

       ulong start= GetMicrosecondCount ();

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

      BENCH += GetMicrosecondCount ()-start;

Résultat :

2021.07.10 08:00 : 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Exécuté = 836973 en 661874 microsecondes

Ainsi, SymbolInfoTick () a pris un total de 661 millisecondes sur les données historiques en 3 minutes et 9 secondes. Cependant, le profileur montre qu'il utilise 74,71% des mesures. Je ne comprends pas à quel point c'est précis ou utile.


Soyons clairs, les tests ne consistent pas seulement à exécuter du code MQL. Le profileur, en capturant des statistiques, ralentit un peu l'exécution.


Cela dit, dans le rapport, 74,71 % est un chiffre relatif au code MQL, et non aux tests en général.

 

Bonjour @Ilyas !

Merci. Je vérifierai à nouveau avec vos réponses et vous tiendrai au courant.

 
Ilyas:
...

Quant aux chiffres :

ce n'est pas le cas, les chiffres sont juste similaires : 209 / 0,83 * 100 = 25180


Correct, sur 25039 mesures, 8171 d'entre elles proviennent de la ligne de code avec l'appel SymbolInfoTick

Je me suis trompé dans les chiffres.

En effet, 209 est 0,83469% de 25039, qui a été arrondi à 0,83


8171 échantillons ont été pris à la ligne avec SymbolInfoTick appelé 210 fois, soit 2,57%.

 
Ilyas :

Je me suis trompé dans les chiffres.

En effet, 209 est 0.83469% de 25039 arrondi à 0.83


8171 exécutions ont eu lieu sur une branche d'exécution du programme où la ligne appelant SymbolInfoTick a été exécutée 210 fois, soit 2,57%.

Exécution à partir de OnTimer (), donc on ne sait pas vraiment pourquoi c'est 8171 ? Quand OnTimer () Total CPU montre 29683.
 
Alain Verleyen:
Exécution à partir de OnTimer (), donc on ne sait pas vraiment pourquoi c'est 8171 ? Quand OnTimer () Total CPU montre 29683.

Veuillez fournir le code, je vais vérifier le fonctionnement des compteurs.

 
Ilyas :

Veuillez fournir le code, je vais vérifier le fonctionnement des compteurs.

Je le ferai en privé dès que j'en aurai le temps. Merci.
 
Ilyas:

Ilyas, aide-moi à comprendre ça aussi.

1. Pourquoi un appel de fonction vide peut prendre 34,5% du Self CPU ? Dans le même temps, l'appel de la fonction qui le suit, dont les éléments internes occupent 38,16 % de la CPU totale, n'apparaît pas du tout dans le rapport ?


Code de fonction :



2. Cet exemple montre le deuxième problème : la ligne avec TimeCurrent() prend un temps déraisonnable non seulement dans la fonction mais dans le programme en général :

Avant que je ne commente le corps de CheckTimeSeries(), la charge principale se trouvait sur sa ligne TimeCurrent().

Est-ce vraiment une fonction si lourde ? Par quoi le remplacer ? Ou comment le rendre économique (mise en cache dans une seule boucle d'exécution du programme) ?

Chaque fois que je le peux, j'économise les calculs en les diluant (une fois par barre, une fois toutes les X secondes, une fois toutes les Y ms, etc.) Mais il s'avère que la vérification elle-même, qu'il s'agisse de faire les calculs, est assez gourmande en ressources.


Merci pour votre aide.