次の方法で共有


.NET Framework 2.0 におけるプロファイリングの変更点

更新 : 2007 年 11 月

.NET Framework Version 2.0 ではプロファイル API が強化され、機能が追加されています。新機能は、2 つの新しいインターフェイス ICorProfilerCallback2 および ICorProfilerInfo2 によって公開されます。

.NET Framework Version 1.0 または 1.1 用に作成されたプロファイラ DLL は、.NET Framework 2.0 の共通言語ランタイム (CLR: Common Language Runtime) 環境では正常に動作しません。Version 2.0 で動作するようにプロファイラ DLL を更新するには、ICorProfilerCallback2 インターフェイスを実装する必要があります。ICorProfilerInfo2 インターフェイスは ICorProfilerInfo インターフェイスを継承し、CLR との強化された対話をサポートする新しいメソッドが導入されています。

ジェネリック

ランタイムへのジェネリックの導入により、次の 3 つの変更がプロファイル API に加えられました。

  • typedef トークンと ClassID 値との間、または MethodDef トークンと FunctionID 値との間に 1 対 1 の対応関係がなくなりました。これは、各クラスまたは関数を複数の異なる型でインスタンス化できるようになったためです。プロファイラの作成者は、「プロファイリングとランタイム通知 ID」を読んで、コード内での ICorProfilerInfo::GetClassFromToken メソッドおよび ICorProfilerInfo::GetFunctionFromToken メソッドの使い方や、コードをジェネリック対応に変更する方法を確認してください。プロファイル API には、ジェネリックをサポートする 2 つの新しいメソッド、ICorProfilerInfo2::GetClassFromTokenAndTypeArgsICorProfilerInfo2::GetFunctionFromTokenAndTypeArgs が用意されています。

  • FunctionID と、これに含まれる ClassID との間に直接の対応関係がなくなりました。コード共有の最適化により、ジェネリック型の異なる種類のインスタンスでコードを共有することができます。FunctionID の ClassID は、関数の特定のアクティブ化のコンテキストでのみ確認できます。

  • クラスや関数の情報を取得する ICorProfilerInfo インターフェイスの既存のメソッドでは、ジェネリック型およびジェネリック関数の型引数に関する情報は取得できません。この情報を取得するには、ICorProfilerInfo2::GetClassIDInfo2 メソッドおよび ICorProfilerInfo2::GetFunctionInfo2 メソッドを使用します。ただし、これらのメソッドで必ずしも情報が取得できるとは限りません。詳細については、「プロファイリングとランタイム通知 ID」を参照してください。

コードの分割

.NET Framework のアセンブリは、パフォーマンスが最適化されています。プリコンパイル済みネイティブ コードは、関数ごとに複数の領域に分割されています。そのため、既存の ICorProfilerInfo::GetCodeInfo メソッドでは、関数のネイティブ コードの正しいエクステントを取得することができません。プロファイラは、より汎用的な ICorProfilerInfo2::GetCodeInfo2 メソッドを代わりに使用するように切り替える必要があります。

インプロセス デバッグの削除

.NET Framework 2.0 では、インプロセス デバッグは、プロファイル API との整合性のある一連の機能に置き換えられました。その結果、スタック スナップショットおよびオブジェクト検査の各機能が導入されました。

ネイティブ イメージ ジェネレータを使用したコールバック

ネイティブ イメージ ジェネレータ (NGen.exe) の大幅な最適化に伴って、より多くの処理が、実行時ではなくネイティブ イメージの生成時に行われるようになりました。これにより、プロファイル API の動作に次の変更が加えられました。

  • 多くの関数の JITCachedFunctionSearch コールバックでネイティブ イメージが取得されなくなりました。プロファイラでは、コールバックの使用方法に応じて次の 2 つのオプションを選択できます。

    • 関数についての情報を収集するためにコールバックを使用する場合は、プログラムの実行中、その関数が最初に呼び出されたときにのみ、関数の情報を収集するスキームに切り替えることができます。

    • インストルメンテーションのために、コールバックを使用して関数の Just-In-Time (JIT) コンパイルを強制的に実行する場合は、プロファイラが拡張したネイティブ イメージを代わりに使用できます。詳細については、「プロファイル API でのコード生成」を参照してください。

  • 多くの型の ClassLoad コールバックでネイティブ イメージが取得されなくなりました。このようなクラスでは、実行時に評価する手法 (遅延評価) を使用する必要があります。プロファイラが拡張したネイティブ イメージを既に使用している場合は、あえて動作を変更する必要はありません。ただし、プロファイラが拡張したネイティブ イメージは通常のイメージとは大幅に異なるため、特に理由がない限り、プロファイラが拡張したネイティブ イメージには切り替えないでください。

ガベージ コレクションのコールバックの拡張

ガベージ コレクションのコールバックは、いくつかの点で拡張されています。コールバックは、ガベージ コレクション ハンドルが作成または破棄されたことをプロファイラに通知し、終了されるオブジェクトのキューに関する情報を提供するようになりました。また、Collect メソッドを使用してガベージ コレクションを強制するようになりました。ICorProfilerCallback::RootReferences の拡張である ICorProfilerCallback2::RootReferences2 メソッドでは、各ルートの種類に関する情報が提供されます。また、ICorProfilerCallback2::SurvivingReferences メソッドでは、非圧縮ガベージ コレクションで生じたヒープ内のオブジェクトのレイアウトが報告されます。

固定オブジェクト

.NET Framework 2.0 の新機能である固定オブジェクトは、ネイティブ イメージの生成時に初期化され、ネイティブ イメージに書き込まれる定数オブジェクトです。固定オブジェクトは、ガベージ コレクションによって再配置されることはありませんが、ガベージ コレクション オブジェクトによって参照される場合があります。新しい ICorProfilerInfo2::EnumModuleFrozenObjects メソッドを使用すると、プロファイラで固定オブジェクトを列挙できます。

その他の API の変更

.NET Framework 2.0 では、その他に次の API も変更されています。

参照

その他の技術情報

.NET Framework でのプロファイル

プロファイル API の主要概念

プロファイリングの概要