Sobre o profiler do código MT5 - página 5

 
A única coisa confusa é o segundo deslize. O resto está tudo no lugar.

Vamos descobrir
 
Renat Fatkhullin #:
O único constrangimento é o segundo deslize. O resto está bem.

Aparentemente, o perfilador não é adequado para o propósito de acelerar pedaços de código que correm mais rápido do que alguns milissegundos.

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

O EA está em um deslize de 30ms e o perfilador mostra que estava em uma função com três adições e duas multiplicações por até 13%!


E isto é o que mostra o b2593.

Lá não tem nada! Porque, de fato, aí não há zero. Além disso, no segundo relatório, tudo está muito claro.


Vamos resolver isso para que possamos melhorar, não praguejar.

 
fxsaber #:

O perfilador mostra que até 13% dele estava em uma função com três adições e duas multiplicações!

É por isso que me perguntei por que a EA cujo passe completo OnTick leva em média 3 ms (está cheia de cálculos e trabalhando com ambiente comercial) quando o perfil supostamente 60% está em "três acréscimos e duas multiplicações". Apresentamos estes exemplos sucintos.


Quero usar um antigo profiler no MT5, mas tenho que fazer tais danças com builds. Eu ainda não consegui administrá-lo.

 
fxsaber #:

Por favor, ajude-me a interpretar os dados do profiler com um exemplo simples.


Parece um monte de disparates.

  • O sono(2) está completamente ausente.
  • Por alguma razão a USAGE está comendo várias vezes mais do que Dormir(1).


Tentando realmente apanhar o jeito, sem sorte ainda.


Também tentou substituir o sono.

Ainda não estão claros os valores dos perfis.

O que está no relatório de chamada?

Tenho a impressão de que este código não corresponde ao relatório de captura de tela.
Você tem certeza de que não consertou o código enquanto o profiler estava trabalhando?

 
Ilyas #:

O que está no relatório de chamada?

A impressão é que o código dado não corresponde ao relatório na captura de tela.
Você tem certeza de que não consertou o código enquanto o perfilador estava funcionando?

Não, eu não fiz isso.


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)
 

Eu preciso de ajuda para decifrar os resultados do perfilador.

#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();      
}
Relatório MQL Profiler - MQL5Experts\Test19.mq5
Função Linha Total de CPU Porcentagem Auto CPU Porcentagem
MT4ORDERS::GetHistoryPositionData 1093 7
50.00%
2
14.29%
MT4ORDERS::Order.CloseTimeMsc = ::HistoryDealGetInteger(Ticket, DEAL_TIME_MSC); 1109 1
1
50.00%
} 1360 1
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
0
0.00%
StartTime = ::GetMicrosecondCount(); 1370 1
0
0.00%
Double OrderPriceOpen = ::HistoryOrderGetDouble(OrderTicket, ORDER_PRICE_OPEN) 1182 1
0
0.00%
MT4ORDERS::Order.TicketID = ::HistoryDealGetInteger(MT4ORDERS::Order.Ticket, DEAL_POSITION_ID); 1096 1
0
0.00%
CHashMap<ulong,ulong>::Redimensionar 514 1
7.14%
1
7.14%
m_entries[i].next = m_buckets[balde]; 526 1
1
100.00%
ArrayFill(m_buckets,0,new_size,-1); 518 7
87.50%
0
0.00%
@global_inicializations 1
7.14%
1
7.14%
classe MT4HISTÓRIA 428 1
50.00%
1
100.00%
constool estático MT4ORDERS::IsTester = ::MQLInfoInteger(MQL_TESTER); 2496 1
50.00%
0
0.00%
MT4HISTÓRIA::RefreshHistory 588 6
42.86%
0
0.00%
this.Tickets[this.Amount - 1] = (longo)TicketDeal; 626 2
28.57%
0
0.00%
se (_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>::Adicionar 294 1
7.14%
0
0.00%
Resize(new_size); 600 1
50.00%
0
0.00%
if((candidato%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%
_BVV2(MT4ORDERS::GetHistoryPositionData(Ticket)) 1872 7
46.67%
0
0.00%
return(_B2(MT4ORDERS::MT4OrderSelect(Index, Select, Pool)); 2588 2
13.33%
0
0.00%



Relatório MQL Profiler - MQL5Experts\Test19.mq5
Função Linha Total de CPU Porcentagem Auto CPU Porcentagem
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%
HistóriaSelecione 3
21.43%
3
21.43%
se (_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%
_BVV2(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>::Redimensionar 514 1
7.14%
1
7.14%
Resize(new_size); 600 1
7.14%
1
7.14%
HistóriaDealGetInteger 1
7.14%
1
7.14%
::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX; 636 1
7.14%
1
7.14%
@global_inicializations 1
7.14%
1
7.14%
CHashMap<ulong,ulong>::Adicionar 294 1
7.14%
0
0.00%
this.Tickets[this.Amount - 1] = (longo)TicketDeal; 626 1
7.14%
0
0.00%
nulo OnStart() 3 13
92.86%
0
0.00%
MT4HISTÓRIA::RefreshHistory 588 6
42.86%
0
0.00%
_B2(this.RefreshHistory()); 763 6
42.86%
0
0.00%
 
fxsaber #:

Por favor, ajude-me a decifrar os resultados do perfilador.

O que não está claro?

Eu normalmente ordeno por CPU Total, e vejo o que torna o programa mais lento em geral. Pode ser útil.

Tenho 5700 pedidos em minha história, e na primeira vez que o faço, recebo quase um relatório em branco, e depois recebo algo assim:

HistoryDealGetInteger (todas as ligações tomaram 36%) e HistorySelect (27%) são as que mais comem. Depois vem a HistoryOrderGetInteger (18%) e a global_initialization (9%).

Os 10% restantes foram gastos com o restante do código.


Mas não faz sentido olhar para os resultados durante uma execução única tão rápida, imho.

 
Andrey Khatimlianskii #:

O que não está claro?

Um problema de interpretação. Não há compreensão do que, onde e como está diminuindo a velocidade.

Eu normalmente ordeno por CPU Total, e vejo o que está retardando o programa mais em geral. Pode ser útil.

Tenho quase um relatório em branco na primeira corrida com 5700 pedidos na história, e depois tenho isto:

HistoryDealGetInteger (todas as ligações tomaram 36%) e HistorySelect (27%) são as que mais comem. Depois vem a HistoryOrderGetInteger (18%) e a global_initialization (9%).

Os 10% restantes foram para o restante do código.

Obrigado por sua resposta detalhada. Eu simplesmente não entendo porque os 45% de fio e o resto não foram levados em conta?

 
Andrey Khatimlianskii #:

Mas não adianta olhar para os resultados em um único, imho tão rápido.

Acrescentei uma repetição de 20x em uma longa história.

29,41% (não está claro por que) é devido a um parêntese de fechamento após o retorno. É difícil de interpretar.