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.
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:
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.
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.
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.
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" ou " 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).
|
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 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. |
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:
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.
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 :
En plus de ces types de fonctions, le profileur affiche :
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. |
Les commandes suivantes sont disponibles dans le menu contextuel :