Aide MetaEditorDévelopper des programmesProfilage du code

Profilage du code

Profilage signifie la récolte de paramètres du programme pendant son exécution. Pendant un profilage, l'heure d'exécution et le nombre d'appels aux fonctions individuelles et aux lignes de code du programme sont mesurés. Avec cet outil, le développeut peut trouver et optimiser les sections de code les plus lentes.

Le profilage peut être effectué sur un graphique normal de la plateforme de trading ou en utilisant les données historiques dans le Strategy Tester. Dans le premier cas, un programme est lancé sur un graphique qui est mis à jour en temps réel. Vous pouvez vérifier le comportement du programme en conditions réelles. Dans le deuxième cas, le programme est lancé dans le Strategy Tester en mode visuel. L'avantage de cette méthode est que vous n'avez pas besoin d'attendre les données réelles du serveur de trading ou l'arrivée de certaines conditions de trading.

De nombreux programmes, notamment les indicateurs, n'effectuent des calculs qu'au moment de l'arrivée d'un nouveau tick (OnTick, OnCalculate). Pour évaluer les performances, vous devez donc attendre de recevoir de nouveaux ticks en temps réel. Lors du profilage sur les données historiques, vous pouvez fournir immédiatement la charge désirée et tester les performances du programme même pendant le week-end alors que les marchés sont fermés.

Comment fonctionne le profilage

La méthode "Sampling" (Echantillionnage) est utilisée pour le profilage. Le profileur met en pause le fonctionnement d'un programme MQL (~ 10 000 fois par seconde) et collecte des statistiques sur le nombre de fois qu'une pause s'est produite dans une partie de code particulière. Cela comprend l'analyse des piles d'appels pour déterminer la "contribution" de chaque fonction au temps total d'exécution du code. À la fin du profilage, vous recevez des informations sur le nombre de fois où l'exécution a été interrompue et sur le nombre de fois où chacune des fonctions est apparue sur la pile d'appels:

  • Total CPU [unit,%] - combien de fois la fonction est apparue dans la pile d'appels.
  • Self CPU [unité de mesure,%] - le nombre de "pauses" qui se sont produites directement dans la fonction spécifiée. Cette variable est cruciale pour identifier les goulots d'étranglement : selon les statistiques, les pauses se produisent plus souvent là où plus de temps processeur est nécessaire.

L'échantillonnage est une méthode légère et précise. Contrairement aux autres méthodes, l'échantillonnage n'apporte aucune modification au code analysé, ce qui pourrait affecter sa vitesse d'exécution.

Paramètres de profilage

Par défaut, un programme est exécuté sur le graphique ouvert actuel pour le profilage. Si le profilage est effectué sur des données historiques, les paramètres actuels du testeur de stratégie sont utilisés. Vous pouvez utiliser les Options de MetaEditor pour définir un autre graphique ou pour redéfinir certains des paramètres du testeur.

Débogage

La même section de paramétrage permet d'activer ou de désactiver la fonction inlining lors de la compilation. Lors de l'inlining, le code de fonction est ajouté directement, ce qui permet une accélération significative du programme dans certains cas. Cependant, cette procédure rend difficile le profilage des fonctions. Vous pouvez désactiver l'inlining pour obtenir un rapport sur les fonctions "pures".

Cette option désactive uniquement l'inlining explicite. Les fonctions qui sont implicitement générées par le compilateur peuvent toujours être utilisées. Ces fonctions sont affichées avec le préfixe [inlined].

Le mode d'optimisation du code peut être désactivé afin d'inclure plus de détails dans le rapport de profilage. La vitesse du code sans optimisation peut être plusieurs fois plus lente, mais ce mode offre une couverture de code plus large. Veuillez noter que les goulots d'étranglement du code peuvent être imprécis sans optimisation.

L'option de gestion de l'optimisation est également disponible dans les paramètres du projet.

  • Si l'optimisation est désactivée dans le projet, la nouvelle option est ignorée et l'optimisation sera toujours désactivée pour le profilage (y compris les opérations en ligne).
  • Si l'optimisation est activée dans le projet, la nouvelle option sera prise en compte lors de la compilation du profilage.

Lancer le profilage #

Ouvrez le code source d'un programme (MQ4 ou MQ5). Dans le menu Debug ou dans la barre d'outils Standard, apuyez sur "Lancer le profilage sur les données réelles Lancer le profilage sur les données réelles" ou "Lancer le profilage sur les données historiques Lancer le profilage sur les données historiques".

Après cela, une version spéciale du programme pour le profilage sera compilée automatiquement. Suivant le type de profilage sélectionné, le programme sera lancé sur un graphique normal dans la plateforme de trading ou dans le Strategy Tester (en mode visuel).

Lancer le profilage sur un graphique dans la plateforme de trading

  • Par défaut, une application est lancé sur EURUSD H1. Pour le lancer sur un autre symbole ou une autre période, spécifiez-les dans l'onglet Debug des paramètres de MetaEditor.
  • Le mode de test non visuel est toujours utilisé pour le profilage sur l'historique. Le mode visuel est pratiquement inutile, puisque les ressources sont consommées par le rendu plutôt que par les calculs du programme MQL.

Après le lancement, utilisez l'application pendant quelque temps pour essayer ses fonctionnalités au maximum. Ceci est nécessaire pour que le profileur mesure le temps d'exécution de toutes les fonctions et des lignes du programme.

Stoppez ensuite le profilage : supprimez le programme du graphique ou cliquez sur Arrêter le Profilage Arrêter le Profilage du menu Debug ou de la barre d'outils Standard.

Pour des résultats plus précis de profilage, il est recommandé d'enlever manuellement le programme du graphique au lieu d'utiliser la commande Arrêter le Profilage Arrêter le Profilage.

Voir les résultats du profilage

Une fois le profilage terminé, les résultats sont affichés dans l'onglet Profiler de la fenêtre Boîte à Outils. Les résultats sont en outre affichés directement dans le code : les lignes avec les fonctions appropriées sont mises en évidence. Plus la mise en évidence est brillante, plus il a fallu de temps pour terminer la fonction. Cette fonctionnalité permet une détection rapide et visuelle des goulots d'étranglement du programme.

Le rapport de profilage se présente sous forme de fonctions ou de lignes de programme, pour chacune desquelles deux indicateurs sont disponibles:

  • Total CPU [unit,%] - combien de fois la fonction est apparue dans la pile d'appels.
  • Self CPU [unité de mesure,%] - le nombre de "pauses" qui se sont produites directement dans la fonction spécifiée. Cette variable est cruciale pour identifier les goulots d'étranglement : selon les statistiques, les pauses se produisent plus souvent là où plus de temps processeur est nécessaire.

La valeur est affichée en quantité absolue et en pourcentage de la quantité totale.

Par défaut, la liste affiche de grandes fonctions situées aux niveaux supérieurs. Double-cliquez sur la ligne pour passer à des fonctions plus petites.

Profilage des résultats

Le rapport de profilage peut être visualisé selon deux modes : par appels et par lignes. La deuxième méthode permet d'explorer le code avec un maximum de détails et d'identifier non seulement les fonctions les plus lentes, mais également les parties les plus lentes de ces fonctions. Utilisez le menu contextuel pour basculer entre les modes.

Pour plus de commodité, divers éléments du langage MQL sont affichés sous forme d'icônes dans le rapport :

  • Fonction personnalisée- une fonction personnalisée.
  • Fonction système - une fonction système.
  • Fonction de gestion des événements- une fonction de gestion des événements (On*).
  • Méthode de classe- une méthode de classe.
  • Méthode de classe protégée- une méthode de classe protégée.

En plus de ces types de fonctions, le profileur affiche :

  • Fonction système@global_initializations - données sur l'initialisation de toutes les variables globales.
  • Fonction système@global_deinitializations - données sur la désinitialisation de toutes les variables globales.

Pour afficher le numéro de ligne et le chemin d'accès au fichier dans lequel se trouve la fonction, placez le curseur de la souris sur la ligne appropriée dans le rapport. Pour afficher une fonction dans un fichier, double-cliquez dessus.

Le profiler n'affiche pas toutes les fonctions, mais seulement celles appelées pendant l'exécution du programme.

Menu contextuel #

Les commandes suivantes sont disponibles dans le menu contextuel :

  • Ouvrir – se rend à la ligne ou dans une fonction située dans le fichier du code source. La même action peut être effectuée en double cliquant ou appuyant sur Entrée.
  • Tout Développer – développe toutes les fonctions réduites.
  • Tout Réduire – réduit toutes les fonctions développées.
  • Fonctions par Lignes – voir les résultats du profilage par lignes.
  • Fonctions par Appels – voir les résultats de profilage par appels.
  • Exporter – exporte les résultats de profilage en Open XML (MS Office Excel), HTML (Internet Explorer) ou CSV (fichier texte).
  • Arrangement Automatique – active/désactive le dimensionnement automatique des champs. La même action est effectuée en appuyant sur A.
  • Grille – affiche/cache une grille pour séparer les champs. La même action est effectuée en appuyant sur G.