MT5コードプロファイラについて - ページ 5

 
紛らわしいのは、2枚目のスレだけです。あとは、すべて揃っています。

見てみよう
 
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%もの間、3つの加算と2つの乗算を持つ関数に入っていたことがわかります


そして、b2593が示すのは、このようなことです。

そこにはゼロがある!なぜなら、そこには確かにゼロがあるのだから。しかも、第2報では、すべてが明らかにされている。


悪態をつくのではなく、改善できるように整理しましょう。

 
fxsaber #:

プロファイラを見ると、13%もの割合で、3つの加算と2つの乗算を 行う関数に含まれていたのだ!

だから、プロファイリングで60%は「3回の加算と2回の乗算」で済むはずのEAが、OnTickのフルパスで平均3ms(計算と取引環境との連携でいっぱいいっぱい)かかるのはなぜだろうと思ったのである。このような簡潔な例を思いつきました。


MT5で古いプロファイラを使いたいのですが、ビルドでこういう踊りをさせないといけないんです。まだ実行できていません。

 
fxsaber #:

プロファイラのデータの解釈を簡単な例で教えてください。


すべてがナンセンスに見えてしまうのです。

  • Sleep(2)が完全に欠落しています。
  • なぜかUSAGEはSleep(1)の数倍も食っている。


本当にコツを掴もうとしているのですが、まだうまくいきません。


また、Sleepの交換も試しました。

まだプロファイラの値が明確でない。

コールレポートの内容は?

このコードは、スクリーンショットの報告とは一致しないような気がします。
プロファイラが動作している間にコードを修正したのではないのでしょうか?

 
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 Profiler Report - ୧MQL5┣゙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>::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%
グローバル初期化 1
7.14%
1
7.14%
クラス 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%
if (_B2(::HistorySelect(0, INT_MAX))) 590 3
42.86%
0
0.00%
::HistoryDealGetInteger((TicketDeal = ::HistoryDealGetTicket(this.LastTotalDeals)), DEAL_TIME_MSC) : LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX.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%
if((候補%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 Profiler Report - ୧MQL5┣゙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%
if (_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%
リサイズ(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.LONG_MAX.LONG_MAX.LONG_MAX.LONG_MAX; 636 1
7.14%
1
7.14%
グローバル初期化 1
7.14%
1
7.14%
CHashMap<ulong,ulong>::追加 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 #:

プロファイラの結果を読み解くのにお役立てください。

何が明確でないのか?

私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くするものを確認します。役に立つことがあります。

履歴に5700件の注文があるのですが、最初に実行するとほとんど白紙のレポートが表示され、その後、このようなものが表示されます。

HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。

残りの10%は、残りのコードに費やしました。


でも、そんな高速な1回の実行中に結果を見るのは意味がない、イミフ。

 
Andrey Khatimlianskii #:

何が明確でないのか?

解釈の問題。何が、どこで、どのように減速しているのか、理解できていない。

私は通常、CPUの合計でソートし、全体的に最もプログラムを遅くしているものを確認します。役に立つことがあります。

履歴に5700件の注文がある初動でほぼ白紙のレポートが出たのに、この有様です。

HistoryDealGetInteger(全コールで36%)、HistorySelect(27%)が最も多く食われています。次にHistoryOrderGetInteger(18%)、global_initialization(9%)と続く。

残りの10%は残りのコードに回しました。

詳しいご回答をありがとうございました。ただ、45%-stringsとそれ以外が考慮されていないのが理解できないのですが?

 
Andrey Khatimlianskii #:

でも、こんな素早いシングルで結果を見ても意味がない、イミフ。

長い歴史の中で20倍の繰り返しを追加しました。

29.41%(理由は不明)は、returnの後に閉じ括弧があるため。解釈が難しいですね。