Come lavorare con i contatori delle prestazioni in C #

Windows tiene sotto controllo i processi e i servizi in esecuzione nel sistema monitorando i thread attualmente in esecuzione, la memoria CLR, ecc. Spesso è necessario misurare le prestazioni dei sistemi informatici o delle applicazioni in esecuzione su di essi a metriche come il consumo di risorse nel sistema, i servizi in esecuzione sul sistema o le prestazioni dei dispositivi collegati al sistema.

I contatori delle prestazioni (una funzionalità fornita per impostazione predefinita) ci consentono di acquisire, pubblicare e analizzare i dati sulle prestazioni relativi a una o più applicazioni o servizi in esecuzione nel sistema o nel sistema nel suo insieme.

Durante la creazione di applicazioni, potrebbe spesso essere necessario monitorarne le prestazioni (consumo di risorse o utilizzo per un periodo di tempo) e utilizzare i dati sulle prestazioni per identificare i colli di bottiglia nell'applicazione. È qui che tornano utili i contatori delle prestazioni. È inoltre possibile utilizzare WMI (Windows Management Instrumentation), una tecnologia Microsoft basata su COM, per recuperare questi dettagli, ma i contatori delle prestazioni forniscono un modo per ottenere le statistiche in tempo reale del consumo di risorse nel sistema in fase di esecuzione.

Lo snap-in Performance Monitor (uno strumento fornito per impostazione predefinita nel sistema operativo Windows) può essere utilizzato per visualizzare i dati sulle prestazioni in tempo reale. Per avviare questo strumento, fare clic sul menu Start e fare clic su "Esegui". Quindi, digita "perfmon" e premi Invio.

Contatori delle prestazioni personalizzati

La creazione di contatori delle prestazioni personalizzati è semplice. È possibile creare contatori delle prestazioni utilizzando Esplora server. È necessario creare prima la categoria dei contatori delle prestazioni e quindi creare uno o più contatori come parte di quella categoria.

Per lavorare con i contatori delle prestazioni a livello di codice, è possibile utilizzare la classe System.Diagnostics.PerformanceCounter. È necessario creare un'istanza della classe PerformanceCounter e quindi specificare i valori necessari per ciascuna di queste proprietà: CategoryName, CounterName, MachineName e ReadOnly.

Per creare una categoria di contatori delle prestazioni personalizzata, è necessario utilizzare il metodo Create della classe PerformanceCounterCategory. Ad esempio, il seguente frammento di codice può essere utilizzato per creare una categoria di contatori delle prestazioni personalizzata.

PerformanceCounterCategory.Create("CustomPerformanceCounterCategoryName", "CustomPerformanceCounterHelp", PerformanceCounterCategoryType.MultiInstance,

"CustomPerformanceCounterName", "CustomPerformanceCounterHelp");

Lo snippet di codice seguente mostra come visualizzare tutte le categorie di contatori delle prestazioni disponibili.

static void Main()

    {

        var performanceCounterCategories = PerformanceCounterCategory.GetCategories();

        foreach(PerformanceCounterCategory performanceCounterCategory in performanceCounterCategories)

        {

         Console.WriteLine(performanceCounterCategory.CategoryName);

        }

        Console.Read();

    }

Il frammento di codice seguente illustra come recuperare i contatori delle prestazioni che appartengono alla categoria "Processore".

var performanceCounterCategories = PerformanceCounterCategory.GetCategories()

     .FirstOrDefault(category => category.CategoryName == "Processor");

var performanceCounters = performanceCounterCategories.GetCounters("_Total");

È necessario utilizzare la classe PerformanceCounter per leggere un contatore delle prestazioni appartenente a una particolare categoria. Notare che la classe PerformanceCounter è disponibile nello spazio dei nomi System.Diagnostics. Di seguito è riportato l'elenco completo del codice che mostra come visualizzare i nomi dei contatori delle prestazioni di tutti i contatori delle prestazioni che appartengono alla categoria "Processore".

static void Main()

    {

        var performanceCounterCategories = PerformanceCounterCategory.GetCategories()

            .FirstOrDefault(category => category.CategoryName == "Processor");

        var performanceCounters = performanceCounterCategories.GetCounters("_Total");

        Console.WriteLine("Displaying performance counters for Processor category:--\n");

        foreach (PerformanceCounter performanceCounter in performanceCounters)

        {

            Console.WriteLine(performanceCounter.CounterName);

        }

        Console.Read();

    }

Puoi anche creare il tuo contatore delle prestazioni personalizzato e scrivere i dati al suo interno. Per fare ciò, dovresti sfruttare le classi CounterCreationDataCollection e CounterCreationData.

String customCategory = "Custom Performance Counter Category";

if (!PerformanceCounterCategory.Exists(customCategory))

{

CounterCreationDataCollection counterCreationDataCollection = new CounterCreationDataCollection();

counterCreationDataCollection.Add(new CounterCreationData("Counter 1", "Sample Counter 1", PerformanceCounterType.ElapsedTime));

counterCreationDataCollection.Add(new CounterCreationData("Counter 2", "Sample Counter 2", PerformanceCounterType.SampleCounter));

counterCreationDataCollection.Add(new CounterCreationData("Counter 3", "Sample Counter 3", PerformanceCounterType.SampleCounter));

PerformanceCounterCategory.Create(customCategory, "This is just an example", PerformanceCounterCategoryType.SingleInstance, counterCreationDataCollection);

}

Notare che un controllo se effettuato per convalidare se il contatore delle prestazioni personalizzato da creare esiste già. Il contatore delle prestazioni personalizzato viene creato solo se non esiste. Successivamente, viene creata un'istanza di CounterCreaionDataCollection. Utilizzando la classe CounterCreationData, vengono aggiunti nuovi contatori alla raccolta. Dopo aver aggiunto i contatori necessari, viene chiamato il metodo Create della classe PerformanceCounterCategory per creare la categoria di prestazioni personalizzata.

Tieni presente che la tua applicazione dovrebbe disporre delle autorizzazioni necessarie per accedere ai contatori delle prestazioni necessari. Consiglio sempre di avviare l'IDE di Visual Studio in modalità amministratore. I contatori delle prestazioni aiutano molto ad analizzare le prestazioni delle tue applicazioni: puoi analizzare i dati sulle prestazioni nel momento in cui l'applicazione è in esecuzione.