Acerca del perfilador de código de MT5 - página 5

 
Lo único confuso es el segundo deslizamiento. El resto está todo en su sitio.

Averigüémoslo
 
Renat Fatkhullin #:
La única vergüenza es el segundo resbalón. El resto está bien.

Aparentemente, el perfilador no es adecuado para acelerar trozos de código que se ejecutan más rápido que unos pocos milisegundos.

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

¡El EA está en el deslizamiento durante 30ms y el profiler muestra que hasta el 13% estaba en una función con tres sumas y dos multiplicaciones!


Y esto es lo que muestra b2593.

¡Ahí no hay nada! Porque, efectivamente, ahí hay cero. Además, en el segundo informe, todo está muy claro.


Vamos a solucionarlo para poder mejorar, no jurar.

 
fxsaber #:

El perfilador muestra que hasta el 13% se encontraba en una función con tres sumas y dos multiplicaciones.

Por eso me preguntaba por qué el EA cuyo pase completo de OnTick tarda una media de 3 ms (está lleno de cálculos y trabajando con el entorno de trading) cuando el perfilado supuestamente del 60% está en "tres sumas y dos multiplicaciones". Se me ocurrieron estos sucintos ejemplos.


Quiero usar un perfilador antiguo en MT5, pero tengo que hacer esos bailes con las construcciones. Todavía no he conseguido ejecutarlo.

 
fxsaber #:

Por favor, ayúdame a interpretar los datos del perfilador con un ejemplo sencillo.


Parece una tontería.

  • Sleep(2) ha desaparecido por completo.
  • Por alguna razón USAGE está consumiendo varias veces más que Sleep(1).


Intentando de verdad cogerle el tranquillo, sin suerte todavía.


También probé el reemplazo del sueño.

Todavía no están claros los valores del perfilador.

¿Qué hay en el informe de la convocatoria?

Tengo la impresión de que este código no se corresponde con el informe de las capturas de pantalla.
¿Estás seguro de que no has arreglado el código mientras el perfilador estaba funcionando?

 
Ilyas #:

¿Qué hay en el informe de la convocatoria?

La impresión es que el código dado no coincide con el informe de la captura de pantalla.
¿Seguro que no has arreglado el código mientras se ejecutaba el perfilador?

No, no lo hice.


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)
 

Necesito ayuda para descifrar los resultados del 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();      
}
Informe del Perfilador MQL - \MQL5\Experts\Test19.mq5
Función Línea Total de la CPU Porcentaje Auto CPU Porcentaje
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>::Redimensionar 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%
clase MT4HISTORY 428 1
50.00%
1
100.00%
static consttool 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>::Añadir 294 1
7.14%
0
0.00%
Redimensionar(tamaño_nuevo); 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%
_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%



Informe del Perfilador MQL - \MQL5\Experts\Test19.mq5
Función Línea Total de la CPU Porcentaje Auto CPU Porcentaje
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%
HistoriaSeleccionar 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>::Redimensionar 514 1
7.14%
1
7.14%
Redimensionar(tamaño_nuevo); 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>::Añadir 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 #:

Por favor, ayúdenme a descifrar los resultados del perfilador.

¿Qué no está claro?

Suelo ordenar por el total de la CPU, y ver qué es lo que más ralentiza el programa en general. Puede ser útil.

Tengo un historial de 5700 pedidos, y la primera vez que lo ejecuto, me sale un informe casi en blanco, y luego me sale algo así:

HistoryDealGetInteger (todas las llamadas se llevaron el 36%) e HistorySelect (27%) son las que más consumen. Luego vienen HistoryOrderGetInteger (18%) y global_initialization (9%).

El 10% restante se dedicó al resto del código.


Pero no tiene sentido mirar los resultados durante una ejecución única tan rápida, en mi opinión.

 
Andrey Khatimlianskii #:

¿Qué no está claro?

Un problema de interpretación. No se entiende qué, dónde y cómo se está ralentizando.

Suelo ordenar por el total de la CPU y ver qué es lo que más ralentiza el programa en general. Puede ser útil.

Tengo el informe casi en blanco en la primera ejecución con 5700 órdenes en el historial, y luego tengo esto:

HistoryDealGetInteger (todas las llamadas se llevaron el 36%) e HistorySelect (27%) son las que más consumen. Luego vienen HistoryOrderGetInteger (18%) y global_initialization (9%).

El 10% restante se destinó al resto del código.

Gracias por su detallada respuesta. No entiendo por qué no se ha tenido en cuenta el 45% de las cuerdas y el resto?

 
Andrey Khatimlianskii #:

Pero no tiene sentido mirar los resultados en un rendimiento único tan rápido, imho.

He añadido una repetición de 20x en la historia larga.

El 29,41% (no está claro por qué) se debe a un paréntesis de cierre después de la devolución. Es difícil de interpretar.