MT5コードプロファイラについて

 

新しいプロファイラーを使い始めました。このコーナーでは、正しい使い方の情報を一元化することができました。

まず始めに、プロファイラが 返すデータについて不思議なことがあり、いくつか質問があります。

ヒストリカルデータで動作するEAで使用されるプロファイリングレポートです。

2021.07.08 15:43:06.269  MQL5 profiler 139098  total measurements, 0/0 errors, 320 mb of stack memory analyzed (92848/1073741824)

2021.07.08 15:43:06.269 MQL5プロファイラー 982065個の関数フレームが見つかりました (279627 mql5コード、122460組み込み571051その他、8927システム)

結果(コールによる機能)。

Q1.レポートには139098回の計測とありますが、OnTick()のTotal CPUは150026です、これはどうしたことでしょうか?(ただし、CopyHistoryData 80087は57.58%の正解として、100%=139098を意味する)。

Q2.その他の「機能」は571,051個と報告されています。mqlや組み込み、システムの機能でないとしたら、これらの機能は何でしょうか?

Q3.CopyHistoryDataは80087の総CPUを示し、3つの報告された関数呼び出し(CopyHigh、CopyLow、CopyTime)は異なる総CPUを持ち、OKです。 しかし、これらの関数のネイティブCPUは同じで、総CPU(コールスタック)と等しくなっています。CopyHistoryDataの80087(スタック)の時点で、3つの関数の合計は62,161(44286 + 9448 + 8427)なので、これは正しくないようです。62,161回の呼び出しで、この3つの関数で80,087回の休止が明らかになるとは、どういうことでしょうか。不可能です。唯一の説明は、この数値がCopyHistoryDataのグローバルなものであり、したがって役に立たないということです。何か見落としているのでしょうか?

 

バックテスト。

2021.07.10 08:00: 37.101 Core 01 EURUSD, H1: 230861 ticks, 998 bars generated.テストは、0に渡されます:03:09.367(ダニの前処理を含む0:00:00.515)。

SymbolInfoTick()の実行時間をGetMicrosecondCount()を使って計測するコードを追加しました。

       ulong start= GetMicrosecondCount ();

       //--- Get tick information
       if (! SymbolInfoTick (symbol,tick))
         return ( false );

      BENCH += GetMicrosecondCount ()-start;

結果

2021.07.10 08:00: 37.101 Core 01 2021.05.30 23:59:59 Total = 1209572 Executed = 836973 in661874 microseconds

このように、SymbolInfoTick()は、3分9秒のヒストリカルデータで合計661ミリ秒かかっています。しかし、プロファイラを見ると、74.71%の測定値を使用していることがわかります。これがどの程度正確で有用なのか、私には理解できない。

 

もう一つ、不思議なデータの例です。

グローバル統計によると、SymbolInfoTick()は209回コールスタックに存在しました。しかし、コードの内部には210と書かれています。精度が良い。

グローバル統計によると、SymbolInfoTickは 209回(全サンプルの0.83%)サンプリングされています。OKです。今、コードデータでは1回到達している(1.49%になったので、他の合計を見ると、なんだこれは?)計算すると、1が1.49%に相当するため、総量(100%)は67となる。したがって、1.49%は今回のメイン関数であるOnTimer()のことを指しています。しかし、どうしてそこに1があり、世界の統計で209があるのだろうか。

エラーでなくても、すぐに役立つ(プロファイラのあるべき姿だと私は思うのですが)のはどうしてでしょうか?

 

もうひとつ

これは、先ほどのSymbolInfoTick()の上にあるコード行です。つまり、newTick = false のような代入が5回「選択」されたのです!SymbolInfoTick() を呼び出した後、さらに5回 ( 1 - 1.49% )?冗談はさておき ?

 
バグに違いない、サービスデスクに連絡してください。
 

それが何なのか、何が違うのかを自問自答してください。

  • サンプリングベースのプロファイリング(現在あるもので、Visual Studio C++などと同様のもの)
  • コードツールベースのプロファイリング(以前行っていたもの)

 
Renat Fatkhullin :

それが何なのか、何が違うのかを自問自答してください。

  • サンプリングベースのプロファイリング(現在あるもので、Visual Studio C++などと同様のもの)
  • コードインスツルメンテーションに基づくプロファイリング(以前と同様)

その差は歴然としています。

問題は、データの不整合や誤差がある中で、実際に使うことです。

 
Alain Verleyen:

もう一つ、不思議なデータの例です。

グローバル統計によると、SymbolInfoTick()は209回コールスタックに存在しました。しかし、コードの内部には210と書かれています。精度が良い。

グローバル統計によると、SymbolInfoTickは 209回(全サンプルの0.83%)サンプリングされています。OKです。今、コードデータでは1回到達している(1.49%になったので、他の合計を見ると、なんだこれは?)計算すると、1が1.49%に相当するため、総量(100%)は67となる。したがって、1.49%は今回のメイン関数であるOnTimer()のことを指しています。しかし、どうしてそこに1があり、世界の統計で209があるのだろうか。

エラーでなくても、すぐに役立つ(プロファイラのあるべき姿だと私は思うのですが)のはどうしてでしょうか?

スクリーンショットでは、SymbolInfoTick関数ではなく、呼び出し元の文字列の統計情報が表示されています。

与えられた文字列は、SymbolInfoTickを呼び出す前、あるいは直後に、文字列上に正確に「停止」があった場合、合計210回、SymbolInfoTickからの戻り文字列として209回測定されました

 
Alain Verleyen:

もうひとつ

これは、先ほどのSymbolInfoTick()の上にあるコード行です。つまり、newTick = false のような代入が5回「選択」されたのです!SymbolInfoTick() を呼び出した後、さらに5回 ( 1 - 1.49% )?冗談はさておき ?

書いてあることがよくわからなかった。

このスクリーンショットを読むと、文字列は5回「停止」され、全体の負荷の0.06%、その文字列が属する関数のコードでは7.46%になります。


 

Self CPU "カウンターは、文字列コードがその文字列がある関数の速度に与える影響を表示します。
重要なのは、文字列の中で呼び出された関数の時間は、このカウンターではカウントされないことだ。もしかしたら、これは間違っているのかもしれない。考えてみよう。


総CPU」カウンターは、文字列コードがプログラム全体に及ぼす影響を示すもので、このカウンターは、文字列の中で呼び出される関数を考慮したものです。

 
Ilyas :

書いてあることがよくわからないのですが。

このスクリーンショットの読み方は次の通りです:行は5回「停止」しており、全体の負荷の0.06%、その行が属する関数のコードの7.46%です。


はい、わかっています。(さっきの口調、ちょっと怒ってしまってすみません)。

問題は、:

      newTickф  = false ;                     // Total CPU : 5 (0.06%)    Self CPU : 5 (7.46%)

此れまで

       if (! SymbolInfoTick (symbolф,tickф))     // Total CPU : 210 (2.57%)  Self CPU : 1 (1.49%)

一般的なCPUは問題ありません。

しかし、Self CPUの場合、「newTick = false」が5で、「SymbolInfoTick()」のような関数呼び出しが1しかないのはどうしてでしょうか?私には意味がわからない。

理由: