MetaEditor HilfeProgramme entwickelnCode-Profiling

Code-Profiling

Profiling bedeutet das Sammeln von Programmparametern während der Ausführung. Während eines Profiling werden die Ausführungszeit und die Anzahl der Aufrufe einzelner Funktionen und Programmcode-Zeilen erfasst. Mit diesem Tool ist der Programmierer in der Lage, die langsamsten Codeabschnitte zu finden und zu optimieren.

Das Profiling kann sowohl auf dem normalen Chart der Handelsplattform als auch mit Hilfe von historischen Daten im Strategietester durchgeführt werden. Im ersten Fall wird ein Programm auf einem Chart gestartet, das in Echtzeit aktualisiert wird. Sie können so das Programmverhalten unter realen Bedingungen überprüfen. Im zweiten Fall wird das Programm im Strategietester im visuellen Modus gestartet. Der Vorteil dieser Methode ist, dass Sie nicht auf echte Daten von einem Handelsserver oder das Auftreten bestimmter Handelsbedingungen warten müssen.

Viele Programme, insbesondere Indikatoren, führen erst beim Eintreffen eines neuen Ticks Berechnungen durch (OnTick, OnCalculate). Um die Leistung zu bewerten, müssen Sie also in Echtzeit auf neue Ticks warten. Beim Profiling mit historischen Daten können Sie auch an Wochenenden, an denen Märkte geschlossen sind, sofort die erforderliche Last bereitstellen und die Programmverhalten testen.

Wie das Profiling funktioniert

Für das Profiling wird die Methode "Sampling" verwendet. Der Profiler pausiert den Betrieb eines MQL-Programms (~10 000 Mal pro Sekunde) und sammelt Statistiken darüber, wie oft eine Pause in einem bestimmten Codeteil aufgetreten ist. Dazu gehört auch die Analyse von Aufrufstapeln, um den "Beitrag" jeder Funktion zur gesamten Code-Ausführungszeit zu bestimmen. Am Ende des Profilings erhalten Sie Informationen darüber, wie oft die Ausführung pausiert wurde und wie oft jede der Funktionen auf dem Aufrufstapel erschien:

  • Gesamt-CPU [Einheit,%] – wie oft die Funktion im Aufrufstapel erschien.
  • Eigen-CPU [Maßeinheit,%] – die Anzahl der "Pausen", die direkt innerhalb der angegebenen Funktion aufgetreten sind. Diese Variable ist entscheidend für die Erkennung von Engpässen: Laut Statistik treten Pausen häufiger auf, wenn mehr Prozessorzeit benötigt wird.

Sampling ist eine leichte und genaue Methode. Im Gegensatz zu anderen Methoden werden beim Sampling keine Änderungen am analysierten Code vorgenommen, die dessen Laufgeschwindigkeit beeinträchtigen könnten.

Profiling-Einstellungen

Standardmäßig wird ein Programm zum Profiling auf dem aktuell geöffneten Chart ausgeführt. Wenn das Profiling auf historischen Daten ausgeführt wird, werden die aktuellen Einstellungen des Strategietesters verwendet. Sie können MetaEditor-Optionen verwenden, um einen anderen Chart zu spezifizieren oder um einige der Tester-Einstellungen neu zu definieren.

Debugging

Der gleiche Einstellungsabschnitt ermöglicht das Aktivieren oder Deaktivieren des Inlinings von Funktionen während der Kompilierung. Beim Inlining wird der Funktionscode direkt an seine Aufrufstelle angehängt, was in manchen Fällen eine deutliche Programmbeschleunigung ermöglicht. Allerdings erschwert dieses Verfahren das Profiling von Funktionen. Sie können das Inlining deaktivieren, um einen Bericht über "reine" Funktionen zu erhalten.

Diese Option deaktiviert nur das explizite Inlining. Die Funktionen, die implizit vom Compiler erzeugt werden, können weiterhin verwendet werden. Solche Funktionen werden mit dem Präfix [inlined] angezeigt.

Der Modus zur Code-Optimierung kann deaktiviert werden, um mehr Details in den Profiling-Bericht aufzunehmen. Die Codegeschwindigkeit ohne Optimierung kann um ein Vielfaches langsamer sein, aber dieser Modus bietet eine breitere Codeabdeckung. Bitte beachten Sie, dass Code-Engpässe ohne Optimierung unpräzise sein können.

Die Option zur Verwaltung der Optimierung ist auch unter den Projekteinstellungen verfügbar.

  • Wenn die Optimierung im Projekt deaktiviert ist, dann wird die neue Option ignoriert und die Optimierung wird immer für das Profiling (einschließlich Inlining-Operationen) deaktiviert.
  • Wenn die Optimierung im Projekt aktiviert ist, dann wird die neue Option bei der Kompilierung für das Profiling berücksichtigt.

Starten des Profiling #

Öffnen Sie den Quellcode eines Programms (MQ4 oder MQ5). Im Menü Debug oder der Standard-Symbolleiste drücken Sie "Profiling anhand echter Daten beginnen Profiling anhand echter Daten beginnen" oder "Profiling anhand historischer Daten beginnen Profiling anhand historischer Daten beginnen".

Danach wird automatisch eine spezielle Programmversion für das Profiling erstellt. Je nach gewähltem Typ für das Profiling wird das Programm auf einem normalen Chart in der Handelsplattform oder im Strategietester (im visuellen Modus) gestartet.

Start des Profiling auf einem Chart in der Handelsplattform

  • Standardmäßig wird eine Anwendung auf EURUSD H1 gestartet. Um es auf einem anderen Symbol oder Zeitrahmen zu starten, geben Sie zum Reiter Debug im MetaEditor Optionen.
  • Der nicht-visuelle Testermodus wird immer für das Profiling mit der Historie verwendet. Der visuelle Modus ist praktisch nutzlos, da die Rechenzeit für das Rendern und nicht für die Berechnungen des MQL-Programms verbraucht werden.

Arbeiten Sie nach dem Start einige Zeit mit der Anwendung, um alle Funktionen auszuprobieren. Dies ist notwendig, damit das Profiling die Ausführungszeit aller Funktionen und Befehlszeilen des Programms messen kann.

Dann beenden Sie das Profiling: Löschen Sie das Programm vom Chart oder klicken Sie auf Profiling beenden Profiling beenden aus Debug des Menüs oder in der Standard-Symbolleiste.

Für genauere Ergebnisse des Profiling wird empfohlen, das Programm manuell aus dem Diagramm zu entfernen durch Profiling beenden den Befehl Profiling beenden

Anzeigen der Ergebnisse des Profiling

Nach Abschluss der Profilerstellung werden die Ergebnisse in der Registerkarte Profiler des Fensters Toolbox angezeigt. Zusätzlich werden die Ergebnisse direkt im Code angezeigt: Zeilen mit den entsprechenden Funktionen werden hervorgehoben. Je heller die Hervorhebung, desto länger dauerte die Ausführung der Funktion. Dieses Feature ermöglicht ein schnelles und visuelles Aufspüren von Programm-Engpässen.

Der Profiling-Bericht wird als Funktionen oder Programmzeilen dargestellt, für die jeweils zwei Indikatoren zur Verfügung stehen:

  • Gesamt-CPU [Einheit,%] – wie oft die Funktion im Aufrufstapel erschien.
  • Eigen-CPU [Maßeinheit,%] – die Anzahl der "Pausen", die direkt innerhalb der angegebenen Funktion aufgetreten sind. Diese Variable ist entscheidend für die Erkennung von Engpässen: Laut Statistik treten Pausen häufiger auf, wenn mehr Prozessorzeit benötigt wird.

Der Wert wird als absolute Menge und als Prozentsatz der Gesamtmenge angezeigt.

Standardmäßig zeigt die Liste große Funktionen an, die sich in den oberen Levels befinden. Mit einem Doppelklick auf die Zeile können Sie zu kleineren Funktionen wechseln.

Ergebnisse Profiling

Der Profiling-Bericht kann in zwei Modi angezeigt werden: nach Aufrufen und nach Zeilen. Die zweite Methode erlaubt es, den Code mit maximaler Detailtiefe zu untersuchen und nicht nur die langsamsten Funktionen, sondern auch die langsamsten Teile solcher Funktionen zu identifizieren. Verwenden Sie das Kontextmenü, um zwischen den Modi zu wechseln.

Zur Vereinfachung werden verschiedene Elemente der MQL-Sprache als Icons im Bericht angezeigt:

  • Benutzerdefinierte Funktion – eine nutzerdefinierte Funktion.
  • Systemfunktion – eine Systemfunktion.
  • Funktionen zur Ereignisbehandlung – eine Funktion zur Ereignisbehandlung (Ein*).
  • Klassenmethode – eine Klassenmethode.
  • Geschützten Methode einer Klasse – eine geschützte (protected) Klassenmethode.

Zusätzlich zu diesen Funktionen zeigt der Profiler an:

  • Systemfunktion@global_initializations – Daten über die Initialisierung aller globalen Variablen.
  • Systemfunktion@global_deinitializations – Daten über die Deinitialisierung aller globalen Variablen.

Um die Zeilennummer und den Pfad zu der Datei anzuzeigen, in der sich die Funktion befindet, bewegen Sie den Mauszeiger über die entsprechende Zeile im Bericht. Um eine Funktion in einer Datei anzuzeigen, klicken Sie doppelt darauf.

Der Profiler zeigt nicht alle Funktionen an, sondern nur die, die während des Programmablaufs aufgerufen werden.

Kontextmenü #

Die folgenden Befehle stehen im Kontextmenü zur Verfügung:

  • Öffnen – geht zu einer Zeile oder einer Funktion in einer Quellcodedatei. Das gleiche kann durch Doppelklick oder Drücken von Enter erreicht werden.
  • Alles Ausklappen – alle zusammengeklappten Funktionen aus geklappt.
  • Alles Einklappen – alle erweiterten Funktionen ein geklappt.
  • Funktionen nach Zeilen – Anzeige der Ergebnisse des Profiling nach Zeilen.
  • Funktionen nach Aufrufen – Anzeige der Ergebnisse des Profiling nach Aufrufen.
  • Export – Exportieren der Ergebnisse des Profiling in Open XML (MS Office Excel), HTML (Internet Explorer) oder CSV (Textdatei).
  • Auto-Größe – automatische Größenanpassung von Feldern aktivieren/deaktivieren. Die gleiche Aktion wird durch Drücken von A ausgeführt.
  • Gitter – Gitter ein-/ausblenden, um Felder zu trennen. Die gleiche Aktion wird durch Drücken von G ausgeführt.