MetaEditorヘルププログラムの開発コードのプロファイル

コードのプロファイル

プロファイリングとは、実行中にプログラムパラメータを収集することを意味します。 プロファイリング中に、実行時間と個々の関数とプログラムコード行の呼び出し数が測定されます。 このツールを使用すると、プログラマは最も遅いコードセクションを見つけて最適化することができます。

プロファイルは、トレーディングプラットフォームの通常のチャートで実行することができます。 最初のケースでは、プログラムがリアルタイムで更新されたチャートで起動されます。 プログラムの動作は、実際の状態で確認できます。 2番目のケースでは、プログラムは、ビジュアルモードでストラテジーテスターで起動されます。 このメソッドの利点は、トレードサーバーからの実際のデータまたは特定のトレード条件の発生を待つ必要がないことです。

多くのプログラムは、特にインジケーターは、新しいティック (OnTick、OnCalculate) の到着時にのみ計算を実行します。 したがって、パフォーマンスを評価するためには、リアルタイムで新しいティックを待つ必要があります。 履歴データを使用してプロファイリングを行う場合は、相場が閉じている週末でもプログラムのパフォーマンスをテストできます。

プロファイリングの仕組み

プロファイリングには「サンプリング」方式が使用されます。プロファイラーは、MQLプログラムの操作を一時停止し(1秒あたり約10 000回)、特定のコード部分で一時停止が発生した回数に関する統計を収集します。これには、コールスタックを分析して、コードの合計実行時間に対する各関数の「貢献」を判断することが含まれます。プロファイリングの最後に、実行が一時停止された回数と、各関数が呼び出しスタックに表示された回数に関する情報を受け取ります。

  • 合計CPU [単位、%] — 関数が呼び出しスタックに出現した回数。
  • セルフCPU [測定単位、%] — 指定された関数内で直接発生した「一時停止」の数。この変数はボトルネックを特定する上で非常に重要です。統計によると、より多くのプロセッサー時間が必要な場合、一時停止がより頻繁に発生します。

サンプリングは軽量で正確な方法です。他の方法とは異なり、サンプリングは分析されたコードに変更を加えないため、実行速度に影響を与える可能性がありません。

プロファイリング設定

デフォルトでは、プログラムはプロファイリングのために現在開いているチャートで実行されます。履歴データに対してプロファイリングを実行する場合は、ストラテジーテスターの現在の設定が使用されます。MetaEditorオプションを使用して、他のチャートを指定したり、テスター設定の一部を再定義したりできます。

デバッグ

同じ設定セクションでは、コンパイル中に関数のインライン化を有効または無効にできます。インライン化中には、関数コードが直接呼び出しの場所に追加され、場合によってはプログラムを大幅に高速化できます。ただし、インライン化された関数のプロファイリングは困難になります。インライン化を無効にして、「純粋」関数に関するレポートを取得できます。

このオプションは、明示的なインライン化のみを無効にします。コンパイラによって暗黙的に生成される関数は、引き続き使用されます。このような関数は、[inlined]プレフィックスで表示されます。

プロファイリングレポートに詳細を含めるために、コード最適化モードを無効にすることができます。最適化を行わない場合のコード速度は数倍遅くなる可能性がありますが、このモードではコードカバレッジが広くなります。コードのボトルネックは最適化なしでは不正確になる可能性があることに注意してください。

最適化管理オプションはプロジェクト設定でも使用できます。

  • プロジェクトで最適化が無効になっている場合、新しいオプションは無視されるため、プロファイリング(インライン化操作を含む)では常に最適化が無効になります。
  • プロジェクトで最適化が有効になっている場合、プロファイリングのコンパイル時に新しいオプションが考慮されます。

プロファイリングの起動 #

プログラムのソースコード (MQ4 または MQ5) を開きます デバッグメニューまたは標準ツールバーを選択します。実データのプロファイリングを開始する実際のデータでプロファイリングを開始する "または "ヒストリカルデータのプロファイリングを開始する履歴データのプロファイリングを開始する "

その後、プロファイリング用の特別なプログラムバージョンが自動的にコンパイルされます。 選択したプロファイルタイプに応じて、プログラムはトレーディングプラットフォームまたはストラテジーテスタ (ビジュアルモード) で通常のチャートで起動されます。

トレーディングプラットフォームでのチャートでのプロファイリングの開始

  • デフォルトでは、アプリケーションは EURUSD H1で起動されます。 別のシンボルまたはピリオドで起動するには、MetaEditor設定 の デバッグ タブで指定します。
  • 非ビジュアルテスターモードは、履歴のプロファイリングに常に使用されます。リソースはMQLプログラムの計算ではなくレンダリングによって消費されるため、ビジュアルモードは実際には役に立ちません。

起動後、アプリケーションを使用して、すべての関数を最大にしようします。 プロファイラがすべてのプログラムの関数と行の実行時間を測定するために必要です。

次に、プロファイリングをストップ: チャートからプログラムを削除します。プロファイリングのストップDebugメニューまたは標準ツールバー。でプロファイリングをストップします

より正確なプロファイリング結果を得るには、プログラムを使用する代わりに、チャートから手動で削除することをお勧めします。プロファイリングのストッププロファイリングコマンドをストップ

プロファイリング結果の表示

プロファイリングが終了すると、結果はツールボックスウィンドウのProfiler(プロファイラー)タブに表示されます。結果はさらにコードに直接表示され、該当する関数の行がハイライト表示されます。関数の完了にかかった時間が長いほど、ハイライトが明るくなります。この機能により、プログラムのボトルネックをすばやく視覚的に見つけることができます。

プロファイリングレポートは、関数またはプログラム行として表示され、それぞれに2つの指標があります。

  • 合計CPU [単位、%] — 関数が呼び出しスタックに出現した回数。
  • セルフCPU [測定単位、%] — 指定された関数内で直接発生した「一時停止」の数。この変数はボトルネックを特定する上で非常に重要です。統計によると、より多くのプロセッサー時間が必要な場合、一時停止がより頻繁に発生します。

値は絶対量および合計量の割合として表示されます。

デフォルトでは、リストにはトップレベルにある大きな関数が表示されます。より小さい関数に切り替えるには、行をダブルクリックします。

プロファイリングの結果

プロファイリングレポートは、呼び出しと行の2つのモードで表示できます。2番目のモードでは、コードを最大限に詳細に探索し、最も時間のかかる関数だけでなく、そのような関数で最も時間のかかる部分も特定できます。モードはコンテキストメニューを使用して切り替えます。

便宜上、MQL言語のさまざまな要素がレポートにアイコンとして表示されます。

  • カスタム関数— カスタム関数。
  • システム関数 — システム関数。
  • イベント処理関数— イベント処理関数(On*)。
  • クラスメソッド— クラスメソッド。
  • Protectedクラスメソッド— protectedクラスメソッド。

これらのタイプの関数に加えて、プロファイラーでは以下が表示されます。

  • システム関数@global_initializations — すべてのグローバル変数の初期化に関するデータ。
  • システム関数@global_deinitializations — すべてのグローバル変数の初期化解除に関するデータ。

関数が配置されているファイルの行番号とパスを表示するには、レポートの該当する行にマウスカーソルを合わせます。ファイル内の関数を表示するには、その関数をダブルクリックします。

プロファイラは、すべての関数ではなく、プログラムの操作中に呼び出されたものだけを表示します。

コンテクストメニュー #

コンテキストメニューでは、次のコマンドを使用できます。

  • Open—ソースコードファイル内の行または関数に移動します。 ダブルクリックするか、Enter キーを押しても同じことを行うことができます。
  • Expand All—折りたたまれたすべての関数を展開します。
  • Collapse All—展開されたすべての関数を折りたたみます。
  • Functions by Lines—プロファイリング結果を線で表示する.
  • Functions by Calls—プロファイリング結果をコールで表示する.
  • Export: プロファイリング結果を Open XML (MS Office Excel)、HTML (Internet Explorer)、または CSV (テキストファイル) でエクスポートします。
  • Auto Arrange: フィールドの自動サイズ変更を有効または無効にします。 A を押すと同じ操作が実行されます。
  • Grid-グリッドを表示/非表示にして、フィールドを区切ります。 G を押しても同じアクションが実行されます。