关于MT5代码分析器 - 页 5

 
唯一令人困惑的是第二张纸。其余的都已经到位了。

让我们拭目以待
 
Renat Fatkhullin #:
唯一的尴尬是第二次滑倒。其余的都很好。

显然,剖析器不适合用于加速运行速度超过几毫秒的代码块的目的。

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

EA在滑行中的时间为30ms,剖析器显示,在一个有三个加法和两个乘法的函数中,它所占的比例高达13%!


而这就是b2593所显示的情况。

那里没有任何东西!因为,确实,那里是零。此外,在第二次报告中,一切都非常清楚。


让我们把它整理出来,以便我们能够改进,而不是发誓。

 
fxsaber #:

剖析器显示,在一个有三个加法和两个乘法 的函数中,有多达13%的内容是这样的!

这就是为什么我想知道为什么EA的整个OnTick通道平均需要3毫秒(它充满了计算和交易环境的工作),而据称60%的剖析是在 "三个加法和两个乘法"。想出了这些简洁的例子。


我想在MT5中使用一个旧的剖析器,但我必须用构建来做这样的舞蹈。我还没有设法运行它。

 
fxsaber #:

请用一个简单的例子帮助我解释剖析器的数据。


这看起来像很多的废话。

  • Sleep(2)完全没有。
  • 由于某些原因,USAGE比Sleep(1)多吃了几倍。


真的想掌握它,但还没有运气。


还尝试了睡眠替换。

仍然不清楚剖析器的值。

通话报告里有什么?

我有一个印象,这个代码与截图报告不一致。
你确定你没有在剖析器工作时修复代码吗?

 
Ilyas #:

通话报告里有什么?

给人的印象是,给出的代码与截图中的报告不一致。
你确定你没有在剖析器运行时修改代码?

不,我没有。


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)
 

我需要帮助来解读分析器的结果。

#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剖析器报告 - \MQL5\Experts\Test19.mq5
职能 线路 总CPU 百分比 自己的CPU 百分比
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>::调整大小 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%
类别MT4HISTORY 428 1
50.00%
1
100.00%
静态的 constool MT4ORDERS::IsTester = ::MQLInfoInteger(MQL_TESTER)。 2496 1
50.00%
0
0.00%
MT4HISTORY::RefreshHistory 588 6
42.86%
0
0.00%
this.Ticket[this.Amount - 1] = (long)TicketDeal; 626 2
28.57%
0
0.00%
如果(_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%
调整大小(new_size)。 600 1
50.00%
0
0.00%
如果((候选人%divisor)==0) 40 1
50.00%
0
0.00%
启动时 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剖析器报告 - \MQL5\Experts\Test19.mq5
职能 线路 总CPU 百分比 自己的CPU 百分比
历史订单获取积分(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%
历史选择 3
21.43%
3
21.43%
如果(_B2(::HistorySelect(0, INT_MAX)) 590 3
21.43%
3
21.43%
历史订单获取双倍 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%
获取微秒数 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%
调整大小(new_size)。 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.Ticket[this.Amount - 1] = (long)TicketDeal; 626 1
7.14%
0
0.00%
空白的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 #:

请帮助我解读分析器的结果。

什么是不清楚的?

我通常按总CPU进行排序,看看什么东西在整体上最能降低程序的速度。它可以是有用的。

我的历史上有5700个订单,第一次运行时,我得到的几乎是一个空白的报告,然后我得到这样的东西。

HistoryDealGetInteger(所有调用花了36%)和HistorySelect(27%)吃得最多。然后是HistoryOrderGetInteger(18%)和global_initialization(9%)。

剩下的10%花在代码的其他部分。


但在如此快速的单次执行过程中看结果是没有意义的,我认为。

 
Andrey Khatimlianskii #:

什么是不清楚的?

一个解释的问题。不了解什么、哪里和如何放慢速度。

我通常按照总CPU进行排序,看看什么东西在总体上拖累了程序。它可以是有用的。

我在第一次运行时得到了几乎空白的报告,历史上有5700个订单,然后我得到了这个。

HistoryDealGetInteger(所有调用花了36%)和HistorySelect(27%)吃得最多。然后是HistoryOrderGetInteger(18%)和global_initialization(9%)。

剩余的10%则用于其他代码。

谢谢你的详细回答。我只是不明白为什么45%的线和其他的没有被考虑在内?

 
Andrey Khatimlianskii #:

但在这样一个快速的单子上看结果是没有意义的,我认为。

我在一个很长的历史上增加了一个20倍的重复。

29.41%(不清楚原因)是由于返回后有一个封闭的括号。这很难解释。