Über den MT5-Code-Profiler - Seite 2

 
Ilyas :

Der Screenshot zeigt die Statistik für den Aufrufstring und nicht für die Funktion SymbolInfoTick.

Insgesamt wurde die angegebene Zeichenkette 210 Mal gemessen, einmal genau an der Zeichenkette, vor dem Aufruf von SymbolInfoTick oder kurz danach, und 209 Mal als Rückgabezeichenkette von SymbolInfoTick

Tut mir leid, aber das ist nicht klar.

Die Zusammenfassung des Profiler sagt:

SymbolInfoTick () CPU insgesamt: 209 (0.83%)

Der Kodex selbst besagt:

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

SymbolInfoTick () kommt nur EINMAL im Code vor. Worin diese unterschiedlichen Werte bestehen, ist überhaupt nicht klar. OK, 209 vs. 210, Sie sagten, es liegt daran, dass es einen auf dieser Linie "gestoppt" hat (das ergibt für mich keinen Sinn, aber ich schätze, das ist nicht so wichtig).

Wie sieht es mit dem Prozentsatz aus?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Gesamtmessungen 25039, 0/0 Fehler, 99 MB Stapelspeicher analysiert (92872/1073741824)

209 (0,83%) bedeutet also 100% = 25039. OK

Aber 210 (2,57%) bedeutet 100% = 8171?!? Was bedeutet 8171 für Total CPU?

 
Alain Verleyen :

Was ist damit ( Beitrag #1 )?

Wie Sie sehen können, wird SymbolInfoTick () als der schwierigste Teil des Codes angezeigt. Das ist falsch. Dies ist derselbe Code wie in den folgenden Beiträgen (der SymbolInfoTick mit Total CPU = 209 (0,83%) zeigt, was korrekt ist), der Unterschied ist, dass ich die Zeile auskommentiert habe, in der SymbolInfoTick () Total CPU = 1 war. Die Gesamtausführungszeit (gemäß den historischen Daten) änderte sich durch diese geringfügige Änderung nicht, aber die Profilergebnisse waren anders.

Ich kann den Code privat zur Verfügung stellen, wenn Sie ihn überprüfen wollen.

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

Es tut mir leid, aber das ist nicht klar.

In der Zusammenfassung des Profiler steht:

SymbolInfoTick () CPU insgesamt: 209 (0.83%)

Der Kodex selbst besagt:

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

SymbolInfoTick () kommt nur EINMAL im Code vor. Worin diese unterschiedlichen Werte bestehen, ist überhaupt nicht klar. OK, 209 vs. 210, Sie sagten, es liegt daran, dass es einen auf dieser Linie "gestoppt" hat (das ergibt für mich keinen Sinn, aber ich schätze, das ist nicht so wichtig).

Wie sieht es mit dem Prozentsatz aus?

0 2021.07.10 11: 52: 19.032 MQL5 Profiler Gesamtmessungen 25039, 0/0 Fehler, 99 MB Stapelspeicher analysiert (92872/1073741824)

209 (0,83%) bedeutet also 100% = 25039. OK

Aber 210 (2,57%) bedeutet 100% = 8171?!? Was bedeutet 8171 für Total CPU?

Sie vergleichen Statistiken für "Code-Zeilen" und für "Funktionen"

Es gibt eine Code-Zeile

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

Insgesamt 210 Mal ging diese Codezeile in die Statistik ein:

  • 209 Mal als Codezeile, von der aus SymbolInfoTick aufgerufen wird
  • 1 Mal als ob Betreiber

Es gibt eine Funktion SymbolInfoTick, die 209 Mal auf die Statistik zugreift.
Die Funktion wird nur von dieser Codezeile aus aufgerufen, vielleicht sind Sie deshalb mit den Zählern verwirrt


Was die Zahlen angeht:
209 (0,83%) bedeutet also 100% = 25039. OK

ist es nicht, die Zahlen sind nur ähnlich: 209 / 0,83 * 100 = 25180


Aber 210 (2,57%) bedeutet 100% = 8171?!? Was bedeutet 8171 für Total CPU?

Richtig, von 25039 Messungen stammen 8171 aus der Codezeile mit dem SymbolInfoTick-Aufruf

 

Alain Verleyen:

Backtest läuft bei:

2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 Ticks, 998 generierte Bars. Der Test wurde in 0: 03: 09.367 bestanden (einschließlich der Vorverarbeitung der Ticks 0: 00: 00.515).

Ich habe Code hinzugefügt, um die Ausführungszeit von SymbolInfoTick () mit GetMicrosecondCount () zu messen.

       ulong start= GetMicrosecondCount ();

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

      BENCH += GetMicrosecondCount ()-start;

Ergebnis:

2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Gesamt = 1209572 Ausgeführt = 836973 in 661874 Mikrosekunden

So benötigte SymbolInfoTick () für die historischen Daten in 3 Minuten und 9 Sekunden insgesamt 661 Millisekunden. Der Profiler zeigt jedoch, dass er 74,71 % der Messungen nutzt. Wie genau oder nützlich das ist, weiß ich nicht.


Lassen Sie mich klarstellen, dass es beim Testen nicht nur um die Ausführung von MQL-Code geht. Der Profiler verlangsamt die Ausführung ein wenig, indem er Statistiken aufzeichnet.


Das heißt, in dem Bericht ist 74,71 % eine Zahl, die sich auf MQL-Code bezieht, nicht auf Tests im Allgemeinen.

 

Hallo @Ilyas!

Ich danke Ihnen. Ich werde Ihre Antworten erneut prüfen und Sie auf dem Laufenden halten.

 
Ilyas:
...

Was die Zahlen betrifft:

ist es nicht, die Zahlen sind nur ähnlich: 209 / 0,83 * 100 = 25180


Richtig, von 25039 Messungen stammen 8171 aus der Codezeile mit dem SymbolInfoTick-Aufruf

Ich habe die Zahlen falsch verstanden.

209 ist nämlich 0,83469% von 25039, was auf 0,83 gerundet wurde.


8171 Stichproben wurden in der Zeile genommen, in der SymbolInfoTick 210 Mal aufgerufen wurde, das sind 2,57 %.

 
Ilyas :

Ich habe die Zahlen falsch verstanden.

209 ist nämlich 0,83469% von 25039, gerundet auf 0,83


8171 Durchläufe erfolgten in einem Zweig der Programmausführung, in dem die Zeile , die SymbolInfoTick aufruft, 210 Mal ausgeführt wurde, was 2,57 % entspricht.

Ausführung von OnTimer (), es ist also nicht ganz klar, warum es 8171? Wenn OnTimer () Total CPU 29683 anzeigt.
 
Alain Verleyen:
Ausführung von OnTimer (), es ist also nicht ganz klar, warum es 8171? Wenn OnTimer () Total CPU 29683 anzeigt.

Bitte stellen Sie den Code zur Verfügung, ich werde die Funktion der Zähler überprüfen.

 
Ilyas :

Bitte stellen Sie den Code zur Verfügung, ich werde die Funktion der Zähler überprüfen.

Ich werde dies unter vier Augen tun, sobald ich Zeit habe. Ich danke Ihnen.
 
Ilyas:

Ilyas, helfen Sie mir, auch das herauszufinden.

1. Warum kann ein leerer Funktionsaufruf 34,5 % der Self-CPU in Anspruch nehmen? Gleichzeitig taucht der Aufruf der darauf folgenden Funktion, deren Interna 38,16 % der Gesamt-CPU beanspruchen, in dem Bericht überhaupt nicht auf?


Funktionscode:



2. Dieses Beispiel zeigt das zweite Problem: Die Zeile mit TimeCurrent() dauert nicht nur innerhalb der Funktion, sondern im Programm allgemein unangemessen lange:

Bevor ich den Körper von CheckTimeSeries() auskommentiert habe, lag die Hauptlast auf der Zeile TimeCurrent().

Ist das wirklich eine so schwere Aufgabe? Wodurch soll sie ersetzt werden? Oder wie kann man es wirtschaftlich machen (Zwischenspeicherung innerhalb einer Schleife der Programmausführung)?

Wo immer ich kann, spare ich Berechnungen, indem ich sie ausdünne (einmal pro Takt, einmal alle X Sekunden, einmal alle Y ms, usw.). Es stellt sich jedoch heraus, dass die Prüfung selbst, d. h. die Durchführung der Berechnungen, recht ressourcenintensiv ist.


Vielen Dank für die Hilfe.