継承
Windows Performance Recorder (WPR) の記録プロファイルは、.wprp 拡張子が付いた XML ファイルに保存されます。 WPR では、WPR プロファイルの XML スキーマの Base=”” 属性を使用してオブジェクトの継承をサポートします。 継承を使用すると、共通のプロファイル定義を保持、再利用したり、それに基づいて構築したりして特殊なシナリオを記録できます。 たとえば、既存のプロファイルにプロバイダーを追加することによって、実際のプロファイル内の定義を変更せずにバッファー サイズを変更できます。
重要 WPRP プロファイルを作成する場合は、WPR の組み込み基本プロファイルからプロファイル データを継承するか、同じセッション名を再利用して、同じプロバイダーを複数回有効化しないようにする必要があります。
基本プロファイル
XML タグを使用すると、プロファイルの内容を変更できます。 Operation 属性を使用する必要があります。 Operation 属性で設定可能な値は、Set と Add です。 次の例では、DerivedProfile により、BaseProfile で定義される CpuConfig、CSwitch、および SampledProfile キーワードに ReadyThread システム キーワードが追加されます。
<SystemCollector
Id="BaseSystemCollector" ... />
<SystemProvider
Id="MainSystemProvider">
<Keywords>
<Keyword
Value="CpuConfig"/>
<Keyword
Value="CSwitch"/>
<Keyword
Value="SampledProfile"/>
</Keywords>
</SystemProvider>
<SystemProvider
Id="AnotherSystemProvider">
<Keywords>
<Keyword
Value="ReadyThread"/>
</Keywords>
</SystemProvider>
<Profile
Id="BaseProfile"...>
...
<Collectors>
<SystemCollectorId
Value="BaseSystemCollector">
<SystemProviderId
Value="MainSystemProvider"/>
</SystemCollectorId>
</Collectors>
</Profile>
<Profile
Id="DerivedProfile"
Base="BaseProfile"...>
...
<Collectors Operation="Add"> <!--Use "Add" operation to add new provider to an existing one. -->
<SystemCollectorId
Value="BaseSystemCollector">
<SystemProviderId
Value="AnotherSystemProvider"/> <!--Specify provider to add. -->
</SystemCollectorId>
</Collectors>
</Profile>
注意Operation 属性を指定せずに継承を使用した場合、WPR では既定値の Set が使用されます。
例
次の例では、ファイル ログ記録モードのプロファイルを定義します。 メモリのバージョンはファイルのバージョンから継承され、ログ記録モードのみが上書きされます。
<Profile
Id="SampleProfile.Verbose.File"
LoggingMode = "File"
DetailLevel = "Verbose"
Name = "SampleProfile"
Description = "A sample profile">
…
</Profile>
<Profile
Id="SampleProfile.Verbose.Memory"
Base="SampleProfile.Verbose.File”
LoggingMode = "Memory"
DetailLevel = "Verbose"
Name = "SampleProfile"
Description = "A sample profile"/>
継承のベスト プラクティス
継承が適切に設計されていない場合、意図しない結果になることがあります。 コレクターはコレクターから、プロファイルはプロファイルからのみ派生させることをお勧めします。 複数の種類のオブジェクトにまたがって派生を組み合わせないようにしてください。
次の 3 つの例では、2 つの適切な継承の使用方法について説明します。3 つ目の例では、継承の不適切な使用方法について説明します。
例 1: 継承の適切な使用
いくつかの変更を加えて、Event Collector-A の仕様を使用します。 そのためには次を行います。
Collector-A から仕様を継承する 2 つ目のコレクター (Collector-B) を定義します。
Collector-B を変更します。
Collector-B を参照するようにプロファイルを設定します。
これは適切な実践方法です。その理由は、コレクター オブジェクトのみが別のコレクター オブジェクトから属性を継承し、それがプロファイルによって直接参照されているからです。
例 2: 継承の適切な使用
Profile-A は Collector-A を参照します。
Profile-B は、Profile-A から属性を継承します。
Profile-B の特定の属性を変更します。
プロファイル オブジェクトのみが別のプロファイル オブジェクトから派生しているため、これは適切な実践です。
例 3: 継承の不適切な使用
Profile-A は Collector-A を参照します。
Collector-B は Collector-A から継承します。
Profile-B は Profile-A から継承し、さらに Collector-B も参照します。
この場合、Profile-B は Collector-B を 2 回参照しています。Profile-A による継承を介して 1 回と、Collector-B の直接参照による 1 回です。 この場合、Collector-B の定義を評価する方法、つまり、どの派生が優先されるかが不明確です。 この例は不適切な実践を示しています。その理由は、順序が定義されていないため、操作の順序に基づいて矛盾する結果になる可能性があるからです。 この種の継承は避ける必要があります。