À propos du profileur de code MT5 - page 5

 
La seule chose qui prête à confusion, c'est le deuxième glissement. Le reste est en place.

Voyons voir
 
Renat Fatkhullin #:
Le seul embarras est le deuxième glissement. Le reste est bien.

Apparemment, le profileur n'est pas adapté à l'accélération de morceaux de code dont la vitesse d'exécution dépasse quelques millisecondes.

 
#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);
}

L'EA est dans un glissement pendant 30ms et le profileur montre qu'il était dans une fonction avec trois additions et deux multiplications pendant pas moins de 13% !


Et c'est ce que montre b2593.

Il n'y a rien là ! Parce que, en effet, il n'y a rien là. En outre, sur le deuxième rapport, tout est parfaitement clair.


Réglons ça pour nous améliorer, pas pour jurer.

 
fxsaber #:

Le profileur montre que pas moins de 13 % du temps était consacré à une fonction comportant trois additions et deux multiplications!

C'est pourquoi je me suis demandé pourquoi l'EA dont le passage complet au OnTick prend en moyenne 3 ms (c'est plein de calculs et de travail avec l'environnement de trading) alors que le profilage supposé à 60% est en "trois additions et deux multiplications". J'ai trouvé ces exemples succincts.


Je veux utiliser un ancien profileur dans MT5, mais je dois faire de telles danses avec les builds. Je n'ai pas encore réussi à le faire fonctionner.

 
fxsaber #:

Veuillez m'aider à interpréter les données du profileur à l'aide d'un exemple simple.


Ça ressemble à un tas de bêtises.

  • Sleep(2) est complètement absent.
  • Pour une raison quelconque, USAGE consomme plusieurs fois plus que Sleep(1).


J'essaie vraiment de m'y retrouver, mais je n'ai pas encore eu de chance.


J'ai aussi essayé le remplacement de Sleep.

Les valeurs du profileur ne sont toujours pas claires.

Qu'y a-t-il dans le rapport d'appel ?

J'ai l'impression que ce code ne correspond pas au rapport de la capture d'écran.
Êtes-vous sûr de ne pas avoir corrigé le code pendant que le profileur fonctionnait ?

 
Ilyas #:

Que contient le rapport d'appel ?

L'impression est que le code donné ne correspond pas au rapport dans la capture d'écran.
Vous êtes sûr que vous n'avez pas corrigé le code pendant que le profileur fonctionnait ?

Non, je ne l'ai pas fait.


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)
 

J'ai besoin d'aide pour déchiffrer les résultats du profileur.

#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();      
}
Rapport du profileur MQL - \MQL5\Experts\Test19.mq5
Fonction Ligne Total CPU Pourcentage Self CPU Pourcentage
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>::Resize 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%
classe 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.Amount - 1] = (long)TicketDeal ; 626 2
28.57%
0
0.00%
si (_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%
Redimensionner(nouvelle_taille) ; 600 1
50.00%
0
0.00%
si((candidat%diviseur)==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%



Rapport du profileur MQL - \MQL5\Experts\Test19.mq5
Fonction Ligne Total CPU Pourcentage Self CPU Pourcentage
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%
HistoireSélectionner 3
21.43%
3
21.43%
si (_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>::Resize 514 1
7.14%
1
7.14%
Redimensionner(nouvelle_taille) ; 600 1
7.14%
1
7.14%
HistoriqueDealGetInteger 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.Amount - 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 #:

Veuillez m'aider à déchiffrer les résultats du profileur.

Qu'est-ce qui n'est pas clair ?

J'ai l'habitude de trier par Total CPU, et de voir ce qui ralentit le plus le programme dans son ensemble. Cela peut être utile.

J'ai 5700 commandes dans mon historique, et la première fois que je l'exécute, j'obtiens presque un rapport vide, puis j'obtiens quelque chose comme ceci :

HistoryDealGetInteger (tous les appels ont pris 36%) et HistorySelect (27%) sont les plus gourmands. Viennent ensuite HistoryOrderGetInteger (18%) et global_initialization (9%).

Les 10% restants ont été consacrés au reste du code.


Mais cela n'a pas de sens de regarder les résultats lors d'une exécution unique aussi rapide, je pense.

 
Andrey Khatimlianskii #:

Qu'est-ce qui n'est pas clair ?

Un problème d'interprétation. Aucune compréhension de ce qui, où et comment ralentit.

J'ai l'habitude de trier par Total CPU, et de voir ce qui ralentit le plus le programme dans son ensemble. Il peut être utile.

J'ai un rapport presque vierge au premier passage avec 5700 commandes dans l'historique, et puis j'ai ceci :

HistoryDealGetInteger (tous les appels ont pris 36%) et HistorySelect (27%) sont les plus gourmands. Viennent ensuite HistoryOrderGetInteger (18%) et global_initialization (9%).

Les 10% restants sont allés au reste du code.

Merci pour votre réponse détaillée. Je ne comprends pas pourquoi les 45% de cordes et le reste n'ont pas été pris en compte ?

 
Andrey Khatimlianskii #:

Mais il ne sert à rien de regarder les résultats sur une performance unique aussi rapide, imho.

J'ai ajouté une répétition de 20x sur la longue histoire.

29,41% (on ne sait pas pourquoi) est dû à une parenthèse fermante après return. C'est difficile à interpréter.

Raison: