バックテスト。
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++などと同様のもの)
- コードツールベースのプロファイリング(以前行っていたもの)
それが何なのか、何が違うのかを自問自答してください。
- サンプリングベースのプロファイリング(現在あるもので、Visual Studio C++などと同様のもの)
- コードインスツルメンテーションに基づくプロファイリング(以前と同様)
その差は歴然としています。
問題は、データの不整合や誤差がある中で、実際に使うことです。
もう一つ、不思議なデータの例です。
グローバル統計によると、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回測定されました
もうひとつ
これは、先ほどのSymbolInfoTick()の上にあるコード行です。つまり、newTick = false のような代入が5回「選択」されたのです!SymbolInfoTick() を呼び出した後、さらに5回 ( 1 - 1.49% )?冗談はさておき ?
書いてあることがよくわからなかった。
このスクリーンショットを読むと、文字列は5回「停止」され、全体の負荷の0.06%、その文字列が属する関数のコードでは7.46%になります。
Self CPU "カウンターは、文字列コードがその文字列がある関数の速度に与える影響を表示します。
重要なのは、文字列の中で呼び出された関数の時間は、このカウンターではカウントされないことだ。もしかしたら、これは間違っているのかもしれない。考えてみよう。
総CPU」カウンターは、文字列コードがプログラム全体に及ぼす影響を示すもので、このカウンターは、文字列の中で呼び出される関数を考慮したものです。
書いてあることがよくわからないのですが。
このスクリーンショットの読み方は次の通りです:行は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しかないのはどうしてでしょうか?私には意味がわからない。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しいプロファイラーを使い始めました。このコーナーでは、正しい使い方の情報を一元化することができました。
まず始めに、プロファイラが 返すデータについて不思議なことがあり、いくつか質問があります。
ヒストリカルデータで動作する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のグローバルなものであり、したがって役に立たないということです。何か見落としているのでしょうか?