Ereditarietà
I profili di registrazione di Windows Performance Recorder (WPR) vengono archiviati in un file XML con estensione wprp. WPR supporta l'ereditarietà degli oggetti usando l'attributo Base="" nello schema XML del profilo WPR. L'ereditarietà consente di mantenere, riutilizzare e creare definizioni di profilo comuni per registrare scenari specializzati. Ad esempio, è possibile aggiungere un provider a un profilo esistente e quindi modificare le dimensioni del buffer senza modificare una definizione nel profilo effettivo.
Importante Quando si creano profili WPRP, è necessario ereditare i dati del profilo dai profili di base predefiniti di WPR o riutilizzare gli stessi nomi di sessione per evitare di abilitare più volte lo stesso provider.
Profili di base
È possibile usare tag XML per modificare il contenuto di un profilo. È necessario usare l'attributo Operation . I valori possibili per l'attributo Operation sono Set e Add. Nell'esempio seguente , DerivedProfile aggiunge la parola chiave di sistema ReadyThread alla parola chiave CpuConfig, CSwitch e SampledProfile definita da BaseProfile .
<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>
Nota Se non si specifica l'attributo Operation ma si usa l'ereditarietà, WPR usa il valore predefinito Set.
Esempio
Nell'esempio seguente viene definito un profilo per la modalità di registrazione dei file. La versione di memoria eredita dalla versione del file e sovrascrive solo la modalità di registrazione.
<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"/>
Procedure consigliate per l'ereditarietà
L'ereditarietà non progettata può creare conseguenze impreviste. È consigliabile derivare solo gli agenti di raccolta da raccolte o profili dai profili. Non è mai necessario combinare le derivazioni tra più tipi di oggetti.
I tre esempi seguenti descrivono due modi validi per usare l'ereditarietà; il terzo esempio descrive un utilizzo insufficiente dell'ereditarietà.
Esempio 1: Utilizzo valido dell'ereditarietà
Si desidera usare le specifiche di Agente di raccolta eventi-A, con alcune modifiche. A tale scopo, procedere nel seguente modo:
Definire un secondo agente di raccolta (Collector-B) che eredita le specifiche da Collector-A.
Modificare Collector-B.
Impostare il profilo su collector-B di riferimento.
Si tratta di una procedura consigliata perché solo l'oggetto agente di raccolta eredita attributi da un altro oggetto agente di raccolta, che viene quindi fatto riferimento direttamente al profilo.
Esempio 2: Utilizzo valido dell'ereditarietà
Profile-A fa riferimento a Collector-A.
Profile-B eredita gli attributi da Profile-A.
Si modificano determinati attributi in Profile-B.
Questa procedura è valida perché solo l'oggetto profilo deriva da un altro oggetto profilo.
Esempio 3: Scarsa uso dell'ereditarietà
Profile-A fa riferimento a Collector-A.
Collector-B eredita da Collector-A.
Profile-B eredita da Profile-A e fa riferimento anche a Collector-B.
In questo caso, Profile-B fa riferimento a Collector-B due volte: una volta tramite ereditarietà da Profile-A e una volta per riferimento diretto a Collector-B. In questo caso, non è chiaro come deve essere valutata la definizione per Collector-B; vale a dire, quale derivazione deve avere la precedenza. Questo esempio illustra una pratica errata perché l'ordinamento non è definito e potrebbe causare risultati contraddittori in base all'ordinamento delle operazioni. Questo tipo di ereditarietà deve essere evitato.