API を使用したプロファイリングセッションの制御
プロファイリング API(英語) は、プロファイリングプロセスを制御できるようにする多数のクラスを提供します。例: アプリケーションのコードから、次のことができます。
メモリのスナップショットを取得:
MemoryProfiler.GetSnapshot(string name)
,メモリ割り当てデータの収集を有効または無効にします:
MemoryProfiler.CollectAllocations(bool enable)
,ガベージコレクションを強制する:
MemoryProfiler.ForceGc()
,
API クラスの詳細については、API 参照を参照してください。
プロファイリング API を使用する必要がある主なシナリオは 2 つあります。
この場合、別個の自己プロファイリング API(英語) を使用する必要があることに注意してください。
コードの特定の部分をプロファイリングする
API を使用すると、分析範囲を絞り込み、関心のあるコードのみをプロファイルすることができます。たとえば、適切なタイミングでスナップショットを取得するボタンをクリックするのはそれほど簡単ではありません。プロファイリング API を使用すると、コードの正確な時点で「スナップショットを取得する」呼び出しを実行できます。
dotMemory 2018.3 以前では、別のバージョンのプロファイリング API が使用されていたことに注意してください (この API の詳細については、dotMemory 2018.3 のドキュメントを参照してください)。この API は引き続きサポートされていますが、このセクションで説明する最新の API バージョンを使用することを強くお勧めします。
主な概念
API のソースコードは GitHub(英語) で入手できます。コードは Apache ライセンスで配布されています。
プロファイリング API は、プロジェクトで参照する必要がある JetBrains.Profiler.API(英語) NuGet パッケージとして配布されています。
API を有効にするには、プロファイラーオプションで有効なプロファイリングを制御する方法 | API の使用パラメーターを使用してプロファイリングセッションを開始する必要があります。
API を使用する場合、通常のプロファイリングセッションと比較した場合の唯一の違いは、セッションの制御方法です。プロファイリングコントローラーのボタンをクリックする代わりに、対応する API メソッドを呼び出します。
プロファイリングなしでアプリケーションを実行すると、API メソッドの呼び出しは無視されます。API はエラーをスローしません。
プロファイリングセッションを制御するために使用する必要がある主なクラスは
MemoryProfiler
静的クラスです。メモリのスナップショットを取得してディスクに保存するには、
MemoryProfiler.GetSnapshot(string name)
を呼び出します。これは、プロファイリングコントローラーのスナップショットを取得するボタンを押すのと同じです。メモリ割り当てデータの収集を有効 / 無効にするには、
CollectAllocations(bool enable)
を呼び出します。これは、割り当てを収集するボタンを押すのと同じです。CollectAllocations(bool enable)
呼び出しが有効になるかどうかを確認するには、MemoryProfiler.GetFeatures()
を使用します。このチェックは必須ではありません。
コードの特定部分のプロファイリングに API を使用するには
プロジェクトで
JetBrains.Profiler.API
NuGet パッケージを参照してください。ユースケースに応じて、
MemoryProfiler
クラスのメソッドへの呼び出しをコードに挿入します。例:private void SomeMethod() { // Enable collecting memory allocation data MemoryProfiler.CollectAllocations(true); ...// Here goes some code that I want to profile // Get a snapshot MemoryProfiler.GetSnapshot("my snapshot"); }dotMemory からアプリケーションのプロファイリングを開始し、プロファイラーオプションでプロファイリングを制御する方法 | API の使用パラメーターを選択します。
自己プロファイルアプリケーションを作成する
名前が示すように、このシナリオでは、アプリケーションが自身をプロファイルします。前のシナリオとの主な違いは、プロファイリングを開始する方法です。プロファイリング API を使用してコードの特定の部分をプロファイルする場合は、セッションを手動で開始します (たとえば、dotMemory UI を使用)。自己プロファイルされたアプリケーションの場合、セッションはアプリケーションコードから直接開始されます。
主な概念
自己プロファイル API は、プロジェクトで参照する必要がある別個の JetBrains.Profiler.SelfApi(英語) NuGet パッケージです。
プロファイリングセッションを制御するために、API は dotMemory.exe コマンドラインツールを使用します。
dotMemory.exe ツールはパッケージの一部ではありません。
DotMemory.EnsurePrerequisite()
メソッドを使用して API を初期化すると、API は JetBrains.dotMemory.Console(英語) NuGet パッケージの最新バージョンをダウンロードします。デフォルトでは、パッケージのツールは %LOCALAPPDATA%\JetBrains\Profiler フォルダーに保存されます。別の場所を指定するには、
DotMemory.EnsurePrerequisite()
メソッドのdownloadTo
引数を使用します。dotMemory.exe ツールを含むパッケージがすでに存在する場合、新しいパッケージはダウンロードされません。
単一のスナップショットを取得するには、
DotMemory.GetSnapshotOnce()
メソッドを使用します。複数のスナップショットを取得するには、次のことを行う必要があります。
DotMemory.Attach()
を使用して現在のプロセスにアタッチしますDotMemory.GetSnapshot()
を使用して任意の数のスナップショットを取得するDotMemory.Detach()
を使用してプロセスからデタッチします
たとえば、保存されたスナップショットのパスを指定するなど、プロファイリングセッションを構成するには、
DotMemory.Config
クラスのインスタンスを使用する必要があります。セルフプロファイリング API は、プロファイリング API と同時に使用できます。
結果の自己プロファイルスナップショットには、
.dmw
ファイル拡張子が付いています(実際には dotMemory ワークスペースです)。
アプリケーションに自己プロファイリングを追加するには
プロジェクトで
JetBrains.Profiler.SelfApi
NuGet パッケージを参照してください。DotMemory.EnsurePrerequisite()
メソッドを呼び出して、自己プロファイル API を初期化します。API が dotMemory.exe コマンドラインツールをダウンロードする必要があるため、最初の初期化には時間がかかることに注意してください。ダウンロードプロセスを追跡し、それをキャンセルする機能がある場合は、DotMemory.EnsurePrerequisitesAsync()
メソッドを直接使用します。CancellationToken
を使用し、コールバック変数を使用して進行状況を追跡できます。ユースケースの必要に応じて API 呼び出しを追加します。
スナップショットが 1 つだけ必要な場合:
static void Main(string[] args) { ... // Here goes some init code // Initialize the API and download dotMemory.exe (if needed) DotMemory.EnsurePrerequisite(); SomeMethod(); } private void SomeMethod() { ... // Here goes some code that I want to profile // Get a snapshot and save it to Temp var config = new DotMemory.Config(); config.SaveToDir("C:\\Temp\\Workspace"); DotMemory.GetSnapshotOnce(config); }複数のスナップショットが必要な場合:
static void Main(string[] args) { ... // Here goes some init code // Initialize the API and download dotMemory.exe (if needed) DotMemory.EnsurePrerequisite(); // create profiling config and attach to the current process var config = new DotMemory.Config(); config.SaveToDir("C:\\Temp\\Workspace"); DotMemory.Attach(config); SomeMethod(collection); // Detach from the current process DotMemory.Detach(); } private void SomeMethod(IEnumerable<String> collection) { foreach (var item in collection) { ... // Here goes some code that I want to profile // Get a snapshot DotMemory.GetSnapshot("my snapshot"); } }
関連ページ:

API 参照
プロファイリング API:MemoryProfiler クラスのメソッドプロファイラで現在アクティブな機能のセットを返します。値のビットフラグは、現在のプロファイラの状態を完全に記述しています。各ビットは、対応する機能が現在利用可能かどうかを示します。プロファイラーが動作する準備ができているかどうかを示します。このフラグは、プロファイラーを現在のプロセスにアタッチする場合にのみチェックする必要があります。プロファイラーがコマンドを受け入れる準備ができると、フラグが設定されます。プロファイリン...

プロファイリングセッションの制御
プロファイリングセッションを実行すると、dotMemory は新しい分析タブを開き、プロファイリングされたアプリケーションを起動します。プロファイリングプロセスを制御するには、ページの上部にある次のボタンを使用します。スナップショットを取得するプロセスのリストで選択されたプロセスのメモリスナップショットを取得します。スナップショットは、収集されたスナップショット領域に追加されます。スナップショットを取得してもプロファイリングプロセスは中断されないため、別のスナップショットを取得できます (たとえ...