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

 
Ilyas :

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

与えられた文字列は、一旦文字列で正確に「停止」し、SymbolInfoTickの呼び出し前または直後に、SymbolInfoTickからの戻り文字列として209回、合計210回計測されました

申し訳ないが、はっきりしない。

プロファイラの概要にはこうあります。

SymbolInfoTick() 総 CPU 数:209 (0.83%)

コード自体にはこう書いてある。

SymbolInfoTick () 総 CPU 数:210 (2.57%)

SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。

パーセントはどうでしょうか?

0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。

つまり、209(0.83%)は100%=25039を意味する。よっしゃー

しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?

 
Alain Verleyen :

これはどうでしょう(投稿1番)。

ご覧のように、SymbolInfoTick()が一番難しい部分として表示されています。どちらが不正解か。これは以下の投稿と同じコードです(SymbolInfoTickがTotal CPU = 209 (0.83%) と表示されていますが、これは正しいです)。違いは、SymbolInfoTick () が Total CPU = 1 となる行をコメントアウトしていることです。このわずかな変更で総実行時間(過去のデータによる)は変わりませんでしたが、プロファイラの結果は違っていました。

確認したい場合は、非公開でコードを提供します。

О профилировщике кода MT5
О профилировщике кода MT5
  • 2021.07.09
  • www.mql5.com
Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать...
 
Alain Verleyen:

申し訳ないが、はっきりしない。

プロファイラの概要にはこうあります。

SymbolInfoTick() 総 CPU 数:209 (0.83%)

コード自体にはこう書いてある。

SymbolInfoTick () 総 CPU 数:210 (2.57%)

SymbolInfoTick () は、コード内で1回だけ発生します。この異なる価値観が何であるかは、まったくもって不明である。なるほど、209対210は、そのラインで1本「止めた」からだと(私には意味不明ですが、あまり関係ないのでしょうね)。

パーセントはどうでしょうか?

0 2021.07.10 11:52:19.032 MQL5プロファイラ 合計測定値 25039、0/0エラー、99MBスタックメモリは、(92872/1073741824)分析した。

つまり、209(0.83%)は100%=25039を意味する。よっしゃー

しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?

あなたは、「コード行」と「関数」の統計を比較しています

コード行があります。

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

このコードの行が統計に載ったのは合計210回。

  • SymbolInfoTickが呼び出されるコードラインとして209回目
  • 演算子として1回

SymbolInfoTickという関数があり、この関数が209回統計にヒットしています。
この関数はこの行からしか呼ばれないので、もしかしたらカウンターと混同してしまったのかもしれません


数字については、
つまり、209(0.83%)は100%=25039を意味する。OK

209 / 0.83 * 100 = 25180 となります。


しかし、210(2.57%)ということは、100%=8171 なのか!?Total CPUの8171とは何ですか?

25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。

 

Alain Verleyen:

バックテスト。

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%の測定値を使用していることがわかります。これがどの程度正確で有用なのか、私には理解できない。


はっきりさせておきますが、テストはMQLコードの実行だけではありません。プロファイラは、統計情報を取得することで、実行速度を少し落とします。


とはいえ、レポート中の74.71%はMQLコードに対する数字であり、テスト全般の数字ではありません。

 

こんにちは、@Ilyas です。

ありがとうございます。ご回答いただいた内容で再度確認し、ご報告させていただきます。

 
Ilyas:
...

数字については、

209 / 0.83 * 100 = 25180 となります。


25039個の測定値のうち、8171個がSymbolInfoTickを呼び出したコードラインから得られたものです。

数字を間違えてしまった。

実際、209は25039の0.83469%であり、これを四捨五入すると0.83となる


8171個のサンプルがSymbolInfoTickが 210回呼ばれたラインで採取されており、これは2.57%に相当します。

 
Ilyas :

数字を間違えてしまった。

確かに209は25039の0.83469%で四捨五入すると0.83


8171回の実行は、SymbolInfoTickを呼び出す 行が210回実行されたプログラム実行の分岐で、これは2.57%である。

OnTimer()からの実行なので、なぜ8171なのかよくわからない?OnTimer()のTotal CPUが29683と表示された場合。
 
Alain Verleyen:
OnTimer()からの実行なので、なぜ8171なのかよくわからない?OnTimer()のTotal CPUが29683と表示された場合。

コードを提供してください、私はカウンターの動作を再確認します

 
Ilyas :

コードを提供してください、私はカウンターの動作を再確認します

時間ができ次第、プライベートで行う予定です。ありがとうございます。
 
Ilyas:

イリヤス、この件も解決してくれ。

1.なぜ空の関数呼び出しがセルフのCPUの34.5%を消費することがあるのか?同時に、それに続く関数の呼び出しは、その内部で総CPUの38.16%を占めていますが、レポートには全く表示されないのですね。


ファンクションコードです。



2.この例では、TimeCurrent()の行が関数内だけでなく、プログラム全般で不当に長い時間を要していることが2つ目の問題点として示されています。

CheckTimeSeries()の本体をコメントアウトする前は、そのTimeCurrent()の行に主な負荷がかかっていたのです。

そんなに重い機能なんですか?何に置き換えたらいいのか?あるいは、経済的な方法(プログラム実行の1ループ内でのキャッシング)は?

できる限り、計算を間引いて保存しています(1小節に1回、X秒に1回、Yミリ秒に1回、など)。しかし、計算を行うかどうかのチェック自体が、かなりリソースを消費することが判明しました。


ありがとうございました。