Über den MT5-Code-Profiler - Seite 5

 
Das einzige, was verwirrend ist, ist der zweite Zettel. Der Rest ist bereits vorhanden.

Finden wir es heraus
 
Renat Fatkhullin #:
Die einzige Peinlichkeit ist der zweite Ausrutscher. Der Rest ist in Ordnung.

Offensichtlich ist der Profiler nicht geeignet, um Codeabschnitte, die schneller als ein paar Millisekunden laufen, zu beschleunigen.

 
#include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer(1);

void Sleep2( uint Interval )
{
  const ulong StartTime = GetMicrosecondCount();
  
  Interval *= 1000;
  
  while (GetMicrosecondCount() - StartTime < Interval)
    ;
}

#define Sleep Sleep2

void f()
{
  Sleep(10);
}

void OnTimer()
{
  _USAGE
  
  f();
  
  Sleep(20);
}

Der EA befindet sich 30ms lang in einem Schlupf und der Profiler zeigt, dass er in einer Funktion mit drei Additionen und zwei Multiplikationen sogar 13% lang war!


Und genau das zeigt b2593.

Da gibt es nichts zu sehen! Denn dort gibt es in der Tat nichts. Außerdem ist im zweiten Bericht alles klar und deutlich.


Lassen Sie uns das klären, damit wir uns verbessern können, anstatt zu fluchen.

 
fxsaber #:

Der Profiler zeigt, dass ganze 13% davon in einer Funktion mit drei Additionen und zwei Multiplikationen stecken!

Deshalb habe ich mich gefragt, warum der EA, dessen voller OnTick-Durchlauf im Durchschnitt 3 ms dauert (er ist voll mit Berechnungen und der Arbeit mit der Handelsumgebung), wenn die Profilierung angeblich 60% in "drei Additionen und zwei Multiplikationen" ist. Ich habe mir diese prägnanten Beispiele ausgedacht.


Ich möchte einen alten Profiler in MT5 verwenden, aber ich muss solche Tänze mit Builds machen. Ich habe es noch nicht geschafft, ihn zu starten.

 
fxsaber #:

Bitte helfen Sie mir bei der Interpretation der Profiler-Daten anhand eines einfachen Beispiels.


Das sieht nach einem Haufen Unsinn aus.

  • Sleep(2) fehlt völlig.
  • Aus irgendeinem Grund verbraucht USAGE mehrere Male mehr als Sleep(1).


Ich versuche wirklich, den Dreh rauszukriegen, habe aber noch kein Glück.


Habe auch Sleep Replacement ausprobiert.

Immer noch keine klaren Profiler-Werte.

Was steht im Anrufbericht?

Ich habe den Eindruck, dass dieser Code nicht mit dem Screenshot-Bericht übereinstimmt.
Sind Sie sicher, dass Sie den Code nicht korrigiert haben, während der Profiler lief?

 
Ilyas #:

Was steht im Anrufbericht?

Es entsteht der Eindruck, dass der angegebene Code nicht mit dem Bericht auf dem Screenshot übereinstimmt.
Sind Sie sicher, dass Sie den Code nicht korrigiert haben, während der Profiler lief?

Nein, das habe ich nicht.


2021.09.10 11:46:48.616 MQL5 profiler   8064 total measurements, 0/0 errors, 2014 kb of stack memory analyzed (11256/1073741824)
2021.09.10 11:46:48.616 MQL5 profiler   49442 total function frames found (9141 mql5 code, 6461 built-in, 11590 other, 22250 system)
 

Ich brauche Hilfe beim Entschlüsseln der Profilergebnisse.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

void OnStart()
{   
  double Res = 0;
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderProfit();      
}
MQL-Profiler-Bericht - \MQL5\Experts\Test19.mq5
Funktion Leitung CPU insgesamt Prozentsatz Eigene CPU Prozentsatz
MT4ORDERS::GetHistoryPositionData 1093 7
50.00%
2
14.29%
MT4ORDERS::Order.CloseTimeMsc = ::HistoryDealGetInteger(Ticket, DEAL_TIME_MSC); 1109 1
12.50%
1
50.00%
} 1360 1
12.50%
1
50.00%
return(Ticket && ((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || 824 2
25.00%
0
0.00%
WHILE(_B2(MT4ORDERS::HistorySelectOrder(OrderTicket))) // https://www.mql5.com/ru/forum/304239#comment_10710403 1151 1
12.50%
0
0.00%
StartTime = ::GetMicrosecondCount(); 1370 1
12.50%
0
0.00%
double OrderPriceOpen = ::HistoryOrderGetDouble(OrderTicket, ORDER_PRICE_OPEN) 1182 1
12.50%
0
0.00%
MT4ORDERS::Order.TicketID = ::HistoryDealGetInteger(MT4ORDERS::Order.Ticket, DEAL_POSITION_ID); 1096 1
12.50%
0
0.00%
CHashMap<ulong,ulong>::Größe ändern 514 1
7.14%
1
7.14%
m_entries[i].next = m_buckets[bucket]; 526 1
12.50%
1
100.00%
ArrayFill(m_buckets,0,new_size,-1); 518 7
87.50%
0
0.00%
@global_initializations 1
7.14%
1
7.14%
Klasse MT4HISTORY 428 1
50.00%
1
100.00%
static constool MT4ORDERS::IsTester = ::MQLInfoInteger(MQL_TESTER); 2496 1
50.00%
0
0.00%
MT4HISTORY::RefreshHistory 588 6
42.86%
0
0.00%
this.Tickets[this.Betrag - 1] = (long)TicketDeal; 626 2
28.57%
0
0.00%
wenn (_B2(::HistorySelect(0, INT_MAX)) 590 3
42.86%
0
0.00%
::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX; 636 1
14.29%
0
0.00%
return(!::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) || (::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) && 660 1
14.29%
0
0.00%
CHashMap<ulong,ulong>::Add 294 1
7.14%
0
0.00%
Größe ändern(neue_Größe); 600 1
50.00%
0
0.00%
if((Kandidat%Divisor)==0) 40 1
50.00%
0
0.00%
OnStart 3 13
92.86%
0
0.00%
_B2(this.RefreshHistory()); 763 6
40.00%
0
0.00%
_BV2(MT4ORDERS::GetHistoryPositionData(Ticket)) 1872 7
46.67%
0
0.00%
return(_B2(MT4ORDERS::MT4OrderSelect(Index, Select, Pool)); 2588 2
13.33%
0
0.00%



MQL-Profiler-Bericht - \MQL5\Experts\Test19.mq5
Funktion Leitung CPU insgesamt Prozentsatz Eigene CPU Prozentsatz
HistoryOrderGetInteger 3
21.43%
3
21.43%
WHILE(_B2(MT4ORDERS::HistorySelectOrder(OrderTicket))) // https://www.mql5.com/ru/forum/304239#comment_10710403 1151 1
7.14%
3
21.43%
return(Ticket && ((::HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) || 824 2
14.29%
3
21.43%
GeschichteWählen Sie 3
21.43%
3
21.43%
wenn (_B2(::HistorySelect(0, INT_MAX)) 590 3
21.43%
3
21.43%
HistoryOrderGetDouble 2
14.29%
2
14.29%
double OrderPriceOpen = ::HistoryOrderGetDouble(OrderTicket, ORDER_PRICE_OPEN) 1182 1
7.14%
2
14.29%
return(!::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) || (::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) && 660 1
7.14%
2
14.29%
MT4ORDERS::GetHistoryPositionData 1093 7
50.00%
2
14.29%
_BV2(MT4ORDERS::GetHistoryPositionData(Ticket)) 1872 7
50.00%
2
14.29%
GetMicrosecondCount 1
7.14%
1
7.14%
StartTime = ::GetMicrosecondCount(); 1370 1
7.14%
1
7.14%
CHashMap<ulong,ulong>::Größe ändern 514 1
7.14%
1
7.14%
Größe ändern(neue_Größe); 600 1
7.14%
1
7.14%
HistoryDealGetInteger 1
7.14%
1
7.14%
::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX; 636 1
7.14%
1
7.14%
@global_initializations 1
7.14%
1
7.14%
CHashMap<ulong,ulong>::Add 294 1
7.14%
0
0.00%
this.Tickets[this.Betrag - 1] = (long)TicketDeal; 626 1
7.14%
0
0.00%
void OnStart() 3 13
92.86%
0
0.00%
MT4HISTORY::RefreshHistory 588 6
42.86%
0
0.00%
_B2(this.RefreshHistory()); 763 6
42.86%
0
0.00%
 
fxsaber #:

Bitte helfen Sie mir, die Ergebnisse des Profilers zu entschlüsseln.

Was ist nicht klar?

Normalerweise sortiere ich nach Gesamt-CPU und schaue, was das Programm insgesamt am meisten verlangsamt. Das kann nützlich sein.

Ich habe 5700 Aufträge in meiner Historie, und wenn ich ihn das erste Mal ausführe, erhalte ich fast einen leeren Bericht, und dann bekomme ich etwas wie das hier:

HistoryDealGetInteger (alle Aufrufe benötigten 36 %) und HistorySelect (27 %) fressen am meisten. Danach folgen HistoryOrderGetInteger (18 %) und global_initialization (9 %).

Die restlichen 10 % wurden für den Rest des Codes verwendet.


Aber es macht keinen Sinn, die Ergebnisse während einer so schnellen Einzelausführung zu betrachten.

 
Andrey Khatimlianskii #:

Was ist nicht klar?

Ein Problem der Interpretation. Es ist nicht klar, was, wo und wie die Verlangsamung stattfindet.

Normalerweise sortiere ich nach Gesamt-CPU und schaue, was das Programm insgesamt am meisten verlangsamt. Das kann nützlich sein.

Ich habe einen fast leeren Bericht über den ersten Lauf mit 5700 Aufträgen in der Historie, und dann habe ich dies:

HistoryDealGetInteger (alle Aufrufe benötigten 36 %) und HistorySelect (27 %) fressen am meisten. Dann folgen HistoryOrderGetInteger (18 %) und global_initialization (9 %).

Die restlichen 10 % gingen an den Rest des Codes.

Ich danke Ihnen für Ihre ausführliche Antwort. Ich verstehe nur nicht, warum die 45%-Saiten und der Rest nicht berücksichtigt wurden?

 
Andrey Khatimlianskii #:

Aber es macht keinen Sinn, die Ergebnisse bei einer so schnellen Einzelleistung zu betrachten, denke ich.

Ich habe eine 20-fache Wiederholung der langen Geschichte hinzugefügt.

29,41 % (es ist unklar, warum) ist auf eine schließende Klammer nach der Rückgabe zurückzuführen. Es ist schwer zu interpretieren.