Mise à jour : novembre 2007
Représente un composant de compteur de performance Windows NT.
Espace de noms :
System.Diagnostics Assembly :
System (dans System.dll)
Nous ne disposons pas encore d'exemples de code pour ce langage.
/** @attribute HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, SharedState = true) */
public final class PerformanceCounter extends Component implements ISupportInitialize
Le composant PerformanceCounter peut être utilisé à la fois pour la lecture de compteurs prédéfinis ou personnalisés existants et pour la publication (écriture) de données de performance dans des compteurs personnalisés.
Remarque importante : |
|---|
Cette classe requiert que les appelants immédiats soient d'un niveau de confiance suffisant dans les versions 1.0 et 1.1 du .NET Framework. Dans les versions de .NET Framework postérieures à la version 1.1, cette classe requiert PerformanceCounterPermission pour des actions spécifiques. Il est fortement recommandé que PerformanceCounterPermission ne soit pas accordé à du code de niveau de confiance partiel. La capacité de lecture et d'écriture dans les compteurs de performance permet au code d'exécuter des actions telles que l'énumération des processus d'exécution et l'obtention d'informations les concernant. |
Attention : |
|---|
Passer un objet PerformanceCounter à du code d'un niveau de confiance moindre peut créer un problème de sécurité. Ne passez jamais des objets de compteur de performance, tel que PerformanceCounterCategory ou PerformanceCounter, à du code d'un niveau de confiance moindre. |
Pour lire un compteur de performance, créez une instance de la classe PerformanceCounter, définissez CategoryName, CounterName et éventuellement les propriétés InstanceName ou MachineName, puis appelez la méthode NextValue pour lire un compteur de performance.
Pour publier les données de compteurs de performance, créez un ou plusieurs compteurs personnalisés à l'aide de la méthode PerformanceCounterCategory..::.Create, créez une instance de la classe PerformanceCounter, définissez les propriétés CategoryName, CounterName et éventuellement InstanceName ou MachineName, puis appelez les méthodes IncrementBy, Increment ou Decrement, ou encore définissez la propriété RawValue afin de modifier la valeur de votre compteur personnalisé.
Remarque : |
|---|
Les méthodes Increment, IncrementBy et Decrement utilisent des verrouillages internes pour mettre à jour la valeur du compteur. Cela aide à garantir la précision de la valeur de compteur dans les scénarios multithread ou multiprocessus, mais provoque également une altération des performances. L'exactitude fournie par les opérations verrouillées n'est pas nécessaire, vous pouvez mettre à jour directement la propriété RawValue pour améliorer les performances jusqu'à 5 fois. Toutefois, certaines mises à jour de la valeur de compteur peuvent être ignorées dans les scénarios multithread, ce qui entraîne une imprécision des données. |
Le compteur est le mécanisme permettant de recueillir les données de performance. Le Registre stocke les noms de tous les compteurs, chacun d'eux étant lié à une zone spécifique des fonctionnalités du système. Il peut s'agir, par exemple, de la plage de temps occupée d'un processeur, de l'utilisation de la mémoire ou du nombre d'octets reçus sur une connexion réseau.
Chaque compteur est identifié de manière unique à l'aide de son nom et de son emplacement. Exactement comme un chemin d'accès de fichier comprend un lecteur, un répertoire, un ou plusieurs sous-répertoires et un nom de fichier, les informations sur le compteur sont constituées de quatre éléments : l'ordinateur, la catégorie, l'instance de la catégorie et le nom du compteur.
Les informations sur le compteur doivent inclure la catégorie (ou l'objet de performance), pour laquelle le compteur mesure les données. Les catégories d'un ordinateur comprennent les composants physiques, tels que les processeurs, les disques et la mémoire. Il existe également des catégories système, telles que les processus et les threads. Chaque catégorie est liée à un élément fonctionnel au sein de l'ordinateur et un jeu de compteurs standard lui est assigné. Ces objets sont énumérés dans la liste déroulante Objet de performance de la boîte de dialogue Ajouter des compteurs du Moniteur système Windows 2000, et vous devez les spécifier dans le chemin d'accès du compteur. Les données de performance sont regroupées selon catégorie à laquelle elles sont liées.
Dans certains cas, il peut exister plusieurs copies de la même catégorie. Par exemple, plusieurs processus et threads s'exécutent simultanément et certains ordinateurs contiennent plusieurs processeurs. Les copies de catégories sont appelées instances de catégorie, et un jeu de compteurs standard est assigné à chaque instance. Si une catégorie peut posséder plusieurs instances, une spécification d'instance doit être comprise dans les informations sur le compteur.
Pour obtenir les données de performance de compteurs qui exigeaient une valeur initiale ou antérieure pour effectuer les calculs requis, appelez à deux reprises la méthode NextValue et utilisez les informations retournées nécessaires à votre application.
Remarque : |
|---|
Les catégories de compteurs de performance installées avec le .NET Framework 2.0 utilisent une mémoire partagée distincte, chaque catégorie de compteurs de performance possédant sa propre mémoire. Vous pouvez spécifier la taille d'une mémoire partagée distincte en créant un DWORD nommé FileMappingSize dans la clé de Registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<NomCatégorie>\Performance. La taille de la mémoire partagée de la catégorie est affectée à la valeur FileMappingSize. La taille par défaut est 131072 au format décimal. Si la valeur FileMappingSize n'est pas présente, l'attribut fileMappingSize de l'élément performanceCounters spécifié dans le fichier Machine.config est utilisé, ce qui entraîne une charge supplémentaire pour le traitement du fichier de configuration. Vous pouvez réaliser une amélioration des performances au démarrage de l'application en définissant la taille du mappage de fichier dans le Registre. Pour plus d'informations sur la taille du mappage de fichier, consultez <performanceCounters>, élément. |
Remarque sur la plateforme Windows 98, Windows Millennium Edition :
Les compteurs de performance ne sont pas pris en charge sous Windows 98 ou Windows Millennium Edition (Me).
L'exemple de code suivant illustre l'utilisation de la classe PerformanceCounter. L'exemple crée des catégories, installe des compteurs, rassemble des données à partir des compteurs et appelle la classe CounterSampleCalculator pour interpréter les données des compteurs de performance. Les résultats intermédiaires et définitifs sont affichés dans la fenêtre de la console.
Imports System
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Diagnostics
_
Public Class App
Private Shared PC As PerformanceCounter
Private Shared BPC As PerformanceCounter
Public Shared Sub Main()
Dim samplesList As New ArrayList()
'If the category does not exist, create the category and exit.
'Performance counters should not be created and immediately used.
'There is a latency time to enable the counters, they should be created
'prior to executing the application that uses the counters.
'Execute this sample a second time to use the counters.
If Not (SetupCategory()) Then
CreateCounters()
CollectSamples(samplesList)
CalculateResults(samplesList)
End If
End Sub 'Main
Private Shared Function SetupCategory() As Boolean
If Not PerformanceCounterCategory.Exists("AverageCounter64SampleCategory") Then
Dim CCDC As New CounterCreationDataCollection()
' Add the counter.
Dim averageCount64 As New CounterCreationData()
averageCount64.CounterType = PerformanceCounterType.AverageCount64
averageCount64.CounterName = "AverageCounter64Sample"
CCDC.Add(averageCount64)
' Add the base counter.
Dim averageCount64Base As New CounterCreationData()
averageCount64Base.CounterType = PerformanceCounterType.AverageBase
averageCount64Base.CounterName = "AverageCounter64SampleBase"
CCDC.Add(averageCount64Base)
' Create the category.
PerformanceCounterCategory.Create("AverageCounter64SampleCategory", _
"Demonstrates usage of the AverageCounter64 performance counter type.", _
PerformanceCounterCategoryType.SingleInstance, CCDC)
Return True
Else
Console.WriteLine("Category exists - AverageCounter64SampleCategory")
Return False
End If
End Function 'SetupCategory
Private Shared Sub CreateCounters()
' Create the counters.
PC = New PerformanceCounter("AverageCounter64SampleCategory", "AverageCounter64Sample", False)
BPC = New PerformanceCounter("AverageCounter64SampleCategory", "AverageCounter64SampleBase", False)
PC.RawValue = 0
BPC.RawValue = 0
End Sub 'CreateCounters
Private Shared Sub CollectSamples(samplesList As ArrayList)
Dim r As New Random(DateTime.Now.Millisecond)
' Loop for the samples.
Dim j As Integer
For j = 0 To 99
Dim value As Integer = r.Next(1, 10)
Console.Write(j.ToString() + " = " + value.ToString())
PC.IncrementBy(value)
BPC.Increment()
If j Mod 10 = 9 Then
OutputSample(PC.NextSample())
samplesList.Add(PC.NextSample())
Else
Console.WriteLine()
End If
System.Threading.Thread.Sleep(50)
Next j
End Sub 'CollectSamples
Private Shared Sub CalculateResults(samplesList As ArrayList)
Dim i As Integer
For i = 0 To (samplesList.Count - 1) - 1
' Output the sample.
OutputSample(CType(samplesList(i), CounterSample))
OutputSample(CType(samplesList((i + 1)), CounterSample))
' Use .NET to calculate the counter value.
Console.WriteLine(".NET computed counter value = " + CounterSampleCalculator.ComputeCounterValue(CType(samplesList(i), CounterSample), CType(samplesList((i + 1)), CounterSample)).ToString())
' Calculate the counter value manually.
Console.WriteLine("My computed counter value = " + MyComputeCounterValue(CType(samplesList(i), CounterSample), CType(samplesList((i + 1)), CounterSample)).ToString())
Next i
End Sub 'CalculateResults
'++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
' Description - This counter type shows how many items are processed, on average,
' during an operation. Counters of this type display a ratio of the items
' processed (such as bytes sent) to the number of operations completed. The
' ratio is calculated by comparing the number of items processed during the
' last interval to the number of operations completed during the last interval.
' Generic type - Average
' Formula - (N1 - N0) / (D1 - D0), where the numerator (N) represents the number
' of items processed during the last sample interval and the denominator (D)
' represents the number of operations completed during the last two sample
' intervals.
' Average (Nx - N0) / (Dx - D0)
' Example PhysicalDisk\ Avg. Disk Bytes/Transfer
'++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
Private Shared Function MyComputeCounterValue(s0 As CounterSample, s1 As CounterSample) As [Single]
Dim numerator As [Single] = CType(s1.RawValue, [Single]) - CType(s0.RawValue, [Single])
Dim denomenator As [Single] = CType(s1.BaseValue, [Single]) - CType(s0.BaseValue, [Single])
Dim counterValue As [Single] = numerator / denomenator
Return counterValue
End Function 'MyComputeCounterValue
' Output information about the counter sample.
Private Shared Sub OutputSample(s As CounterSample)
Console.WriteLine(ControlChars.Lf + ControlChars.Cr + "+++++++++++")
Console.WriteLine("Sample values - " + ControlChars.Lf + ControlChars.Cr)
Console.WriteLine((" BaseValue = " + s.BaseValue.ToString()))
Console.WriteLine((" CounterFrequency = " + s.CounterFrequency.ToString()))
Console.WriteLine((" CounterTimeStamp = " + s.CounterTimeStamp.ToString()))
Console.WriteLine((" CounterType = " + s.CounterType.ToString()))
Console.WriteLine((" RawValue = " + s.RawValue.ToString()))
Console.WriteLine((" SystemFrequency = " + s.SystemFrequency.ToString()))
Console.WriteLine((" TimeStamp = " + s.TimeStamp.ToString()))
Console.WriteLine((" TimeStamp100nSec = " + s.TimeStamp100nSec.ToString()))
Console.WriteLine("++++++++++++++++++++++")
End Sub 'OutputSample
End Class 'App
import System.*;
import System.Collections.*;
import System.Collections.Specialized.*;
import System.Diagnostics.*;
public class App
{
private static PerformanceCounter pc;
private static PerformanceCounter bpc;
public static void main(String[] args)
{
ArrayList samplesList = new ArrayList();
SetupCategory();
CreateCounters();
CollectSamples(samplesList);
CalculateResults(samplesList);
} //main
private static boolean SetupCategory()
{
if (!(PerformanceCounterCategory.Exists(
"AverageCounter64SampleCategory"))) {
CounterCreationDataCollection ccdc =
new CounterCreationDataCollection();
// Add the counter.
CounterCreationData averageCount64 = new CounterCreationData();
averageCount64.
set_CounterType(PerformanceCounterType.AverageCount64);
averageCount64.set_CounterName("AverageCounter64Sample");
ccdc.Add(averageCount64);
// Add the base counter.
CounterCreationData averageCount64Base = new CounterCreationData();
averageCount64Base.set_CounterType(PerformanceCounterType.
AverageBase);
averageCount64Base.set_CounterName("AverageCounter64SampleBase");
ccdc.Add(averageCount64Base);
// Create the category.
PerformanceCounterCategory.Create("AverageCounter64SampleCategory",
"Demonstrates usage of the AverageCounter64 performance "
+ "counter type.", ccdc);
return true;
}
else {
Console.WriteLine("Category exists - AverageCounter64SampleCategory");
return false;
}
} //SetupCategory
private static void CreateCounters()
{
// Create the counters.
pc = new PerformanceCounter("AverageCounter64SampleCategory",
"AverageCounter64Sample", false);
bpc = new PerformanceCounter("AverageCounter64SampleCategory",
"AverageCounter64SampleBase", false);
pc.set_RawValue(0);
bpc.set_RawValue(0);
} //CreateCounters
private static void CollectSamples(ArrayList samplesList)
{
Random r = new Random(DateTime.get_Now().get_Millisecond());
// Loop for the samples.
for (int j = 0; j < 100; j++) {
int value = r.Next(1, 10);
Console.Write(j + " = " + value);
pc.IncrementBy(value);
bpc.Increment();
if (j % 10 == 9) {
OutputSample(pc.NextSample());
samplesList.Add(pc.NextSample());
}
else {
Console.WriteLine();
}
System.Threading.Thread.Sleep(50);
}
} //CollectSamples
private static void CalculateResults(ArrayList samplesList)
{
for (int i = 0; i < samplesList.get_Count() - 1; i++) {
// Output the sample.
OutputSample((CounterSample)samplesList.get_Item(i));
OutputSample((CounterSample)samplesList.get_Item(i + 1));
// Use.NET to calculate the counter value.
Console.WriteLine(".NET computed counter value = "
+ CounterSampleCalculator.ComputeCounterValue((CounterSample)
samplesList.get_Item(i),
(CounterSample)samplesList.get_Item(i + 1)));
// Calculate the counter value manually.
Console.WriteLine("My computed counter value = "
+ MyComputeCounterValue((CounterSample)samplesList.get_Item(i),
(CounterSample)samplesList.get_Item(i + 1)));
}
} //CalculateResults
//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
//++++++++
// Description - This counter type shows how many items are processed,
// on average,during an operation.Counters of this type display a
// ratio of the items processed (such as bytes sent) to the number
// of operations completed. The ratio is calculated by comparing
// the number of items processed during the last interval to the
// number of operations completed during the last interval.
// Generic type - Average
// Formula - (N1 - N0) / (D1 - D0), where the numerator (N)
// represents the number of items processed during the last sample
// interval and the denominator (D) represents the number of
// operations completed during the last two sample
// intervals.
// Average (Nx - N0) / (Dx - D0)
// Example PhysicalDisk\ Avg. Disk Bytes/Transfer
//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
//++++++++
private static float MyComputeCounterValue(CounterSample s0,
CounterSample s1)
{
float numerator = (float)s1.get_RawValue() - (float)s0.get_RawValue();
float denomenator = (float)s1.get_BaseValue() - (float)s0.
get_BaseValue();
float counterValue = numerator / denomenator;
return counterValue;
} //MyComputeCounterValue
// Output information about the counter sample.
private static void OutputSample(CounterSample s)
{
Console.WriteLine("\r\n+++++++++++");
Console.WriteLine("Sample values - \r\n");
Console.WriteLine(" BaseValue = " + s.get_BaseValue());
Console.WriteLine(" CounterFrequency = " + s.get_CounterFrequency());
Console.WriteLine(" CounterTimeStamp = " + s.get_CounterTimeStamp());
Console.WriteLine(" CounterType = " + s.get_CounterType());
Console.WriteLine(" RawValue = " + s.get_RawValue());
Console.WriteLine(" SystemFrequency = " + s.get_SystemFrequency());
Console.WriteLine(" TimeStamp = " + s.get_TimeStamp());
Console.WriteLine(" TimeStamp100nSec = " + s.get_TimeStamp100nSec());
Console.WriteLine("++++++++++++++++++++++");
} //OutputSample
} //App
System..::.Object
System..::.MarshalByRefObject
System.ComponentModel..::.Component
System.Diagnostics..::.PerformanceCounter
Tous les membres static (Shared en Visual Basic) publics de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professionnel Édition x64, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98
Le .NET Framework et le .NET Compact Framework ne prennent pas en charge toutes les versions de chaque plateforme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise du .NET Framework.
.NET Framework
Pris en charge dans : 3.5, 3.0, 2.0, 1.1, 1.0
Référence