PerformanceCounter Classe

Definição

Representa um componente do contador de desempenho do Windows NT.

public ref class PerformanceCounter sealed : System::ComponentModel::Component, System::ComponentModel::ISupportInitialize
public sealed class PerformanceCounter : System.ComponentModel.Component, System.ComponentModel.ISupportInitialize
type PerformanceCounter = class
    inherit Component
    interface ISupportInitialize
Public NotInheritable Class PerformanceCounter
Inherits Component
Implements ISupportInitialize
Herança
PerformanceCounter
Implementações

Exemplos

O exemplo de código seguinte demonstra a utilização da PerformanceCounter classe para criar e usar um AverageCount64 tipo de contador. O exemplo cria categorias, define contadores, recolhe dados dos contadores e chama a CounterSampleCalculator classe para interpretar os dados do contador de desempenho. Os resultados intermédios e finais são exibidos na janela da consola. Para exemplos adicionais de outros tipos de contadores de desempenho, veja a PerformanceCounterType enumeração.

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;

public class App
{
    private static PerformanceCounter avgCounter64Sample;
    private static PerformanceCounter avgCounter64SampleBase;

    public static void Main()
    {
        ArrayList samplesList = 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 category.
        if (SetupCategory())
            return;
        CreateCounters();
        CollectSamples(samplesList);
        CalculateResults(samplesList);
    }

    private static bool SetupCategory()
    {
        if ( !PerformanceCounterCategory.Exists("AverageCounter64SampleCategory") )
        {

            CounterCreationDataCollection counterDataCollection = new CounterCreationDataCollection();

            // Add the counter.
            CounterCreationData averageCount64 = new CounterCreationData();
            averageCount64.CounterType = PerformanceCounterType.AverageCount64;
            averageCount64.CounterName = "AverageCounter64Sample";
            counterDataCollection.Add(averageCount64);

            // Add the base counter.
            CounterCreationData averageCount64Base = new CounterCreationData();
            averageCount64Base.CounterType = PerformanceCounterType.AverageBase;
            averageCount64Base.CounterName = "AverageCounter64SampleBase";
            counterDataCollection.Add(averageCount64Base);

            // Create the category.
            PerformanceCounterCategory.Create("AverageCounter64SampleCategory",
                "Demonstrates usage of the AverageCounter64 performance counter type.",
                PerformanceCounterCategoryType.SingleInstance, counterDataCollection);

            return(true);
        }
        else
        {
            Console.WriteLine("Category exists - AverageCounter64SampleCategory");
            return(false);
        }
    }

    private static void CreateCounters()
    {
        // Create the counters.

        avgCounter64Sample = new PerformanceCounter("AverageCounter64SampleCategory",
            "AverageCounter64Sample",
            false);


        avgCounter64SampleBase = new PerformanceCounter("AverageCounter64SampleCategory",
            "AverageCounter64SampleBase",
            false);

        avgCounter64Sample.RawValue=0;
        avgCounter64SampleBase.RawValue=0;
    }
    private static void CollectSamples(ArrayList samplesList)
    {

        Random r = new Random( DateTime.Now.Millisecond );

        // Loop for the samples.
        for (int j = 0; j < 100; j++)
        {

            int value = r.Next(1, 10);
            Console.Write(j + " = " + value);

            avgCounter64Sample.IncrementBy(value);

            avgCounter64SampleBase.Increment();

            if ((j % 10) == 9)
            {
                OutputSample(avgCounter64Sample.NextSample());
                samplesList.Add( avgCounter64Sample.NextSample() );
            }
            else
            {
                Console.WriteLine();
            }

            System.Threading.Thread.Sleep(50);
        }
    }

    private static void CalculateResults(ArrayList samplesList)
    {
        for(int i = 0; i < (samplesList.Count - 1); i++)
        {
            // Output the sample.
            OutputSample( (CounterSample)samplesList[i] );
            OutputSample( (CounterSample)samplesList[i+1] );

            // Use .NET to calculate the counter value.
            Console.WriteLine(".NET computed counter value = " +
                CounterSampleCalculator.ComputeCounterValue((CounterSample)samplesList[i],
                (CounterSample)samplesList[i+1]) );

            // Calculate the counter value manually.
            Console.WriteLine("My computed counter value = " +
                MyComputeCounterValue((CounterSample)samplesList[i],
                (CounterSample)samplesList[i+1]) );
        }
    }

    //++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
    //    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 Single MyComputeCounterValue(CounterSample s0, CounterSample s1)
    {
        Single numerator = (Single)s1.RawValue - (Single)s0.RawValue;
        Single denomenator = (Single)s1.BaseValue - (Single)s0.BaseValue;
        Single counterValue = numerator / denomenator;
        return(counterValue);
    }

    // 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.BaseValue);
        Console.WriteLine("   CounterFrequency = " + s.CounterFrequency);
        Console.WriteLine("   CounterTimeStamp = " + s.CounterTimeStamp);
        Console.WriteLine("   CounterType      = " + s.CounterType);
        Console.WriteLine("   RawValue         = " + s.RawValue);
        Console.WriteLine("   SystemFrequency  = " + s.SystemFrequency);
        Console.WriteLine("   TimeStamp        = " + s.TimeStamp);
        Console.WriteLine("   TimeStamp100nSec = " + s.TimeStamp100nSec);
        Console.WriteLine("++++++++++++++++++++++");
    }
}
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Diagnostics

 _

Public Class App

    Private Shared avgCounter64Sample As PerformanceCounter
    Private Shared avgCounter64SampleBase 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

    Private Shared Function SetupCategory() As Boolean
        If Not PerformanceCounterCategory.Exists("AverageCounter64SampleCategory") Then

            Dim counterDataCollection As New CounterCreationDataCollection()

            ' Add the counter.
            Dim averageCount64 As New CounterCreationData()
            averageCount64.CounterType = PerformanceCounterType.AverageCount64
            averageCount64.CounterName = "AverageCounter64Sample"
            counterDataCollection.Add(averageCount64)

            ' Add the base counter.
            Dim averageCount64Base As New CounterCreationData()
            averageCount64Base.CounterType = PerformanceCounterType.AverageBase
            averageCount64Base.CounterName = "AverageCounter64SampleBase"
            counterDataCollection.Add(averageCount64Base)

            ' Create the category.
            PerformanceCounterCategory.Create("AverageCounter64SampleCategory", _
               "Demonstrates usage of the AverageCounter64 performance counter type.", _
                      PerformanceCounterCategoryType.SingleInstance, counterDataCollection)

            Return True
        Else
            Console.WriteLine("Category exists - AverageCounter64SampleCategory")
            Return False
        End If
    End Function 'SetupCategory

    Private Shared Sub CreateCounters()
        ' Create the counters.

        avgCounter64Sample = New PerformanceCounter("AverageCounter64SampleCategory", "AverageCounter64Sample", False)

        avgCounter64SampleBase = New PerformanceCounter("AverageCounter64SampleCategory", "AverageCounter64SampleBase", False)

        avgCounter64Sample.RawValue = 0
        avgCounter64SampleBase.RawValue = 0
    End Sub

    Private Shared Sub CollectSamples(ByVal 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())

            avgCounter64Sample.IncrementBy(value)

            avgCounter64SampleBase.Increment()

            If j Mod 10 = 9 Then
                OutputSample(avgCounter64Sample.NextSample())
                samplesList.Add(avgCounter64Sample.NextSample())
            Else
                Console.WriteLine()
            End If
            System.Threading.Thread.Sleep(50)
        Next j
    End Sub

    Private Shared Sub CalculateResults(ByVal 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

    '++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++//++++++++
    '	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(ByVal s0 As CounterSample, ByVal 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(ByVal 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
End Class

Observações

O PerformanceCounter componente pode ser usado tanto para ler contadores predefinidos ou personalizados existentes como para publicar (escrever) dados de desempenho em contadores personalizados.

Existem inúmeros marcadores pré-definidos listados na caixa de diálogo Adicionar Contadores do Windows Performance Monitor. Para saber mais sobre os contadores de desempenho do .NET Framework, consulte .

Este tipo implementa a interface IDisposable. Quando terminar de usar o tipo, você deve eliminá-lo direta ou indiretamente. Para descartar o tipo diretamente, chame seu método Dispose em um bloco try/catch. Para descartá-lo indiretamente, use uma construção de linguagem como using (em C#) ou Using (em Visual Basic). Para obter mais informações, consulte a seção "Usando um objeto que implementa IDisposable" no tópico da IDisposable interface.

Importante

Nas versões 1.0 e 1.1 do .NET Framework, esta classe exige que os chamadores imediatos sejam totalmente confiáveis. A partir .NET Framework versão 2.0, esta classe requer PerformanceCounterPermission para ações específicas. Recomenda-se fortemente que PerformanceCounterPermission não seja concedido a código semi-confiável. A capacidade de ler e escrever contadores de desempenho permite que o código realize ações como enumerar processos em execução e obter informações sobre eles.

Além disso, passar um PerformanceCounter objeto para código menos confiável pode criar um problema de segurança. Nunca passe objetos contadores de desempenho, como a PerformanceCounterCategory ou PerformanceCounter, para código menos confiável.

Para ler a partir de um contador de performance, crie uma instância da PerformanceCounter classe, defina as CategoryNamepropriedades , CounterName, e, opcionalmente, as InstanceName ou MachineName , e depois chame o NextValue método para fazer uma leitura do contador de performance.

Para publicar dados de contadores de desempenho, crie um ou mais contadores personalizados usando o PerformanceCounterCategory.Create método, crie uma instância da PerformanceCounter classe, defina as CategoryNamepropriedades , CounterName e, opcionalmente, InstanceName ou MachineName ou, e depois chame os IncrementBy, Increment, ou Decrement métodos, ou defina a RawValue propriedade para alterar o valor do seu contador personalizado.

Note

Os Incrementmétodos , IncrementBy, e Decrement usam bloqueios para atualizar o valor do contador. Isto ajuda a manter o valor contador preciso em cenários multithreaded ou multiprocesso, mas também resulta numa penalização de desempenho. Se não precisar da precisão que as operações interligadas proporcionam, pode atualizar a RawValue propriedade diretamente para uma melhoria de desempenho até 5 vezes. No entanto, em cenários multithreaded, algumas atualizações ao valor contador podem ser ignoradas, resultando em dados imprecisos.

O contador é o mecanismo pelo qual os dados de desempenho são recolhidos. O registo armazena os nomes de todos os contadores, cada um relacionado com uma área específica da funcionalidade do sistema. Exemplos incluem o tempo de ocupação de um processador, o uso de memória ou o número de bytes recebidos através de uma ligação à rede.

Cada balcão é identificado de forma única pelo seu nome e localização. Da mesma forma que um caminho de ficheiro inclui uma unidade, um diretório, um ou mais subdiretórios e um nome de ficheiro, a informação do contador consiste em quatro elementos: o computador, a categoria, a instância da categoria e o nome do contador.

A informação do contador deve incluir a categoria, ou objeto de desempenho, para o qual o contador mede os dados. As categorias de um computador incluem componentes físicos, como processadores, discos e memória. Existem também categorias de sistemas, como processos e threads. Cada categoria está relacionada com um elemento funcional dentro do computador e tem um conjunto de contadores padrão atribuídos. Estes objetos estão listados na lista suspensa de objetos Performance da caixa de diálogo Add Counters dentro do Windows 2000 System Monitor, e deve incluí-los no caminho do contador. Os dados de desempenho são agrupados pela categoria à qual estão relacionados.

Em certos casos, podem existir várias cópias da mesma categoria. Por exemplo, vários processos e threads executam-se simultaneamente, e alguns computadores contêm mais do que um processador. As cópias de categoria são chamadas instâncias de categoria, e cada instância tem um conjunto de contadores padrão atribuídos. Se uma categoria puder ter mais do que uma instância, uma especificação de instância deve ser incluída na contrainformação.

Para obter dados de desempenho para contadores que requerem um valor inicial ou anterior para realizar o cálculo necessário, chame o NextValue método duas vezes e use a informação devolvida conforme a sua aplicação exigir.

Note

As categorias de contadores de desempenho instaladas com .NET usam memória partilhada separada, sendo que cada categoria de contador de desempenho tem a sua própria memória. Pode especificar o tamanho da memória partilhada separada criando um DWORD chamado FileMappingSize na chave do registo HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<nome> da categoria\Performance. O valor FileMappingSize é definido para o tamanho da memória partilhada da categoria. O tamanho padrão é 131072 decimal. Se o valor FileMappingSize não estiver presente, o fileMappingSize valor do atributo para o performanceCounters elemento especificado no ficheiro de Machine.config é utilizado, causando sobrecarga adicional para o processamento de ficheiros de configuração. Pode obter uma melhoria de desempenho no arranque da aplicação definindo o tamanho do mapeamento do ficheiro no registo. Para mais informações sobre o tamanho do mapeamento do ficheiro, consulte <performanceCounters>.

Construtores

Name Description
PerformanceCounter()

Inicializa uma nova instância somente de leitura da PerformanceCounter classe, sem associar a instância a qualquer contador de desempenho do sistema ou personalizado.

PerformanceCounter(String, String, Boolean)

Inicializa uma nova instância de apenas leitura ou leitura/escrita da PerformanceCounter classe e associa-a ao sistema especificado ou ao contador de desempenho personalizado no computador local. Este construtor exige que a categoria contenha uma única instância.

PerformanceCounter(String, String, String, Boolean)

Inicializa uma nova instância de apenas leitura ou leitura/escrita da PerformanceCounter classe e associa-a ao sistema especificado ou ao contador de desempenho personalizado e à instância de categoria no computador local.

PerformanceCounter(String, String, String, String)

Inicializa uma nova instância apenas de leitura da PerformanceCounter classe e associa-a ao sistema especificado ou ao contador de desempenho personalizado e à instância de categoria, no computador especificado.

PerformanceCounter(String, String, String)

Inicializa uma nova instância apenas de leitura da PerformanceCounter classe e associa-a ao sistema especificado ou ao contador de desempenho personalizado e à instância de categoria no computador local.

PerformanceCounter(String, String)

Inicializa uma nova instância apenas de leitura da PerformanceCounter classe e associa-a ao sistema especificado ou ao contador de desempenho personalizado no computador local. Este construtor exige que a categoria tenha uma única instância.

Campos

Name Description
DefaultFileMappingSize
Obsoleto.

Especifica o tamanho, em bytes, da memória global partilhada pelos contadores de desempenho. O tamanho padrão é 524.288 bytes.

Propriedades

Name Description
CanRaiseEvents

Obtém um valor que indica se o componente pode gerar um evento.

(Herdado de Component)
CategoryName

Recebe ou define o nome da categoria do contador de desempenho para este contador de desempenho.

Container

Obtém o IContainer que contém o Component.

(Herdado de Component)
CounterHelp

Obtém a descrição deste contador de desempenho.

CounterName

Recebe ou define o nome do contador de desempenho associado a esta PerformanceCounter instância.

CounterType

Obtém o tipo de contador do contador de desempenho associado.

DesignMode

Obtém um valor que indica se o Component está atualmente em modo de design.

(Herdado de Component)
Events

Obtém a lista de gestores de eventos que estão ligados a isto Component.

(Herdado de Component)
InstanceLifetime

Obtém ou define a vida útil de um processo.

InstanceName

Obtém ou define um nome de instância para este contador de desempenho.

MachineName

Obtém ou define o nome do computador para este contador de desempenho.

RawValue

Obtém ou define o valor bruto, ou não calculado, deste contador.

ReadOnly

Recebe ou define um valor que indica se esta PerformanceCounter instância está em modo apenas de leitura.

Site

Obtém ou define o ISite do Component.

(Herdado de Component)

Métodos

Name Description
BeginInit()

Inicia a inicialização de uma PerformanceCounter instância usada num formulário ou por outro componente. A inicialização ocorre em tempo de execução.

Close()

Fecha o contador de desempenho e liberta todos os recursos alocados por esta instância do contador de desempenho.

CloseSharedResources()

Liberta o estado partilhado da biblioteca de contadores de desempenho atribuído pelos contadores.

CreateObjRef(Type)

Cria um objeto que contém toda a informação relevante necessária para gerar um proxy usado para comunicar com um objeto remoto.

(Herdado de MarshalByRefObject)
Decrement()

Reduz o contador de desempenho associado em um através de uma operação atómica eficiente.

Dispose()

Liberta todos os recursos utilizados pelo Component.

(Herdado de Component)
Dispose(Boolean)

Liberta os recursos não geridos usados pelo Component e opcionalmente liberta os recursos geridos.

(Herdado de Component)
EndInit()

Termina a inicialização de uma PerformanceCounter instância que é usada num formulário ou por outro componente. A inicialização ocorre em tempo de execução.

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetHashCode()

Serve como função de hash predefinida.

(Herdado de Object)
GetLifetimeService()

Recupera o objeto de serviço de tempo de vida atual que controla a política de vida útil neste caso.

(Herdado de MarshalByRefObject)
GetService(Type)

Devolve um objeto que representa um serviço fornecido pelo Component ou pelo seu Container.

(Herdado de Component)
GetType()

Obtém o Type da instância atual.

(Herdado de Object)
Increment()

Incrementa o contador de desempenho associado em um através de uma operação atómica eficiente.

IncrementBy(Int64)

Incrementa ou diminui o valor do contador de desempenho associado numa quantidade especificada através de uma operação atómica eficiente.

InitializeLifetimeService()

Obtém-se um objeto de serviço vitalício para controlar a apólice vitalícia neste caso.

(Herdado de MarshalByRefObject)
MemberwiseClone()

Cria uma cópia superficial do atual Object.

(Herdado de Object)
MemberwiseClone(Boolean)

Cria uma cópia superficial do objeto atual MarshalByRefObject .

(Herdado de MarshalByRefObject)
NextSample()

Obtém uma amostra contadora e devolve o valor bruto, ou não calculado, para ela.

NextValue()

Obtém uma amostra contadora e devolve o valor calculado para ela.

RemoveInstance()

Elimina a instância de categoria especificada pela PerformanceCounter propriedade do objeto InstanceName .

ToString()

Devolve a String contendo o nome do Component, se existir. Este método não deve ser ultrapassado.

(Herdado de Component)

evento

Name Description
Disposed

Ocorre quando o componente é eliminado por uma chamada ao Dispose() método.

(Herdado de Component)

Aplica-se a

Ver também