![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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?
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.
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
Insgesamt 210 Mal ging diese Codezeile in die Statistik ein:
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:
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.
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.
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 %.
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.
Bitte stellen Sie den Code zur Verfügung, ich werde die Funktion der Zähler überprüfen.
Bitte stellen Sie den Code zur Verfügung, ich werde die Funktion der Zähler überprüfen.
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.