[C#] PerformanceCounterの使い方と活用法
PerformanceCounterは、C#でシステムのパフォーマンスデータを取得するためのクラスです。
Windowsのパフォーマンスモニタリング機能を利用して、CPU使用率やメモリ使用量などの情報をリアルタイムで取得できます。
使用するには、まずSystem.Diagnostics
名前空間をインポートし、PerformanceCounter
オブジェクトを作成します。
次に、カテゴリ名、カウンタ名、インスタンス名を指定して初期化します。
例えば、CPU使用率を取得するには、カテゴリ名を”Processor”、カウンタ名を”% Processor Time”、インスタンス名を”_Total”に設定します。
NextValue()メソッド
を呼び出すことで、現在のカウンタ値を取得できます。
これにより、アプリケーションのパフォーマンス監視やリソース管理に役立てることができます。
PerformanceCounterの基本的な使い方
コンソールからの場合は、dotnet add package System.Diagnostics.PerformanceCounter
でインストールできます。
必要な名前空間のインポート
C#でPerformanceCounterを使用するには、まず必要な名前空間をインポートする必要があります。
以下のコードを使用して、System.Diagnostics
名前空間をインポートします。
using System.Diagnostics; // PerformanceCounterを使用するための名前空間
PerformanceCounterオブジェクトの作成
PerformanceCounterを使用するためには、まずPerformanceCounterオブジェクトを作成します。
以下のコードでは、CPU使用率を監視するためのPerformanceCounterオブジェクトを作成しています。
PerformanceCounter cpuCounter = new PerformanceCounter(
"Processor", // カウンターのカテゴリ
"% Processor Time", // 監視するカウンター
"_Total" // インスタンス名
);
カウンターの初期化
PerformanceCounterオブジェクトを作成した後、カウンターを初期化する必要があります。
特に、カウンターの値を取得する前に、必要に応じて初期化処理を行います。
以下のコードは、カウンターの初期化を示しています。
cpuCounter.NextValue(); // 初回の値取得は無視されるため、次の値を取得するために呼び出す
カウンター値の取得方法
カウンターの値を取得するには、NextValueメソッド
を使用します。
このメソッドは、指定したカウンターの現在の値を返します。
以下のコードは、CPU使用率を取得し、コンソールに表示する例です。
float cpuUsage = cpuCounter.NextValue(); // CPU使用率を取得
Console.WriteLine($"CPU使用率: {cpuUsage}%"); // 取得した値を表示
実行結果は以下のようになります。
CPU使用率: 15.0%
このように、PerformanceCounterを使用することで、システムのパフォーマンスを簡単に監視することができます。
具体的な使用例
CPU使用率の取得
CPU使用率を取得するためには、PerformanceCounterを使用して、”Processor”カテゴリの”% Processor Time”カウンターを監視します。
以下のコードは、CPU使用率を取得し、コンソールに表示する例です。
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main()
{
PerformanceCounter cpuCounter = new PerformanceCounter(
"Processor",
"% Processor Time",
"_Total"
);
// 初回の値取得を無視するために呼び出す
cpuCounter.NextValue();
Thread.Sleep(1000); // 1秒待機
float cpuUsage = cpuCounter.NextValue(); // CPU使用率を取得
Console.WriteLine($"CPU使用率: {cpuUsage}%"); // 取得した値を表示
}
}
実行結果は以下のようになります。
CPU使用率: 15.0%
メモリ使用量の監視
メモリ使用量を監視するためには、”Memory”カテゴリの”Available Bytes”カウンターを使用します。
以下のコードは、使用可能なメモリ量を取得し、コンソールに表示する例です。
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
PerformanceCounter memoryCounter = new PerformanceCounter(
"Memory",
"Available Bytes"
);
float availableMemory = memoryCounter.NextValue(); // 使用可能なメモリを取得
Console.WriteLine($"使用可能なメモリ: {availableMemory / (1024 * 1024)} MB"); // MB単位で表示
}
}
実行結果は以下のようになります。
使用可能なメモリ: 2048.0 MB
ディスクI/Oのモニタリング
ディスクI/Oをモニタリングするためには、”PhysicalDisk”カテゴリの”Disk Reads/sec”や”Disk Writes/sec”カウンターを使用します。
以下のコードは、ディスクの読み取りおよび書き込み速度を取得し、コンソールに表示する例です。
using System;
using System.Diagnostics;
class Program
{
static void Main()
{
PerformanceCounter diskReadCounter = new PerformanceCounter(
"PhysicalDisk",
"Disk Reads/sec",
"_Total"
);
PerformanceCounter diskWriteCounter = new PerformanceCounter(
"PhysicalDisk",
"Disk Writes/sec",
"_Total"
);
float diskReads = diskReadCounter.NextValue(); // ディスクの読み取り速度を取得
float diskWrites = diskWriteCounter.NextValue(); // ディスクの書き込み速度を取得
Console.WriteLine($"ディスクの読み取り速度: {diskReads} 回/sec"); // 取得した値を表示
Console.WriteLine($"ディスクの書き込み速度: {diskWrites} 回/sec"); // 取得した値を表示
}
}
実行結果は以下のようになります。
ディスクの読み取り速度: 5.0 回/sec
ディスクの書き込み速度: 3.0 回/sec
これらの具体的な使用例を通じて、PerformanceCounterを利用したシステムのパフォーマンス監視がどのように行えるかを理解できます。
PerformanceCounterの応用
アプリケーションのパフォーマンス監視
PerformanceCounterを使用することで、アプリケーションのパフォーマンスをリアルタイムで監視することができます。
例えば、CPU使用率やメモリ使用量を定期的に取得し、ログに記録することで、アプリケーションの動作状況を把握できます。
以下のコードは、CPU使用率とメモリ使用量を監視し、ログファイルに記録する例です。
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
class Program
{
static void Main()
{
PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
PerformanceCounter memoryCounter = new PerformanceCounter("Memory", "Available Bytes");
using (StreamWriter writer = new StreamWriter("performance_log.txt", true))
{
while (true)
{
float cpuUsage = cpuCounter.NextValue();
float availableMemory = memoryCounter.NextValue() / (1024 * 1024); // MB単位
writer.WriteLine($"CPU使用率: {cpuUsage}%, 使用可能なメモリ: {availableMemory} MB");
writer.Flush(); // バッファをフラッシュして書き込む
Thread.Sleep(5000); // 5秒待機
}
}
}
}
このコードを実行すると、performance_log.txt
ファイルに定期的にパフォーマンスデータが記録されます。
リアルタイムデータの可視化
PerformanceCounterを使用して取得したデータをリアルタイムで可視化することも可能です。
例えば、WPFやWinFormsを使用して、グラフやチャートを表示するアプリケーションを作成できます。
以下は、簡単なWinFormsアプリケーションの例です。
using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
partial class MyForm : Form
{
private PerformanceCounter cpuCounter;
private Chart chart;
private Series series; // シリーズをクラスのメンバとして保持
public MyForm()
{
cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
chart = new Chart { Dock = DockStyle.Fill };
chart.ChartAreas.Add(new ChartArea("CPU Usage"));
Controls.Add(chart);
// シリーズを初期化し、チャートに追加
series = new Series("CPU Usage")
{
ChartType = SeriesChartType.Line
};
chart.Series.Add(series);
Timer timer = new Timer { Interval = 1000 }; // 1秒ごとに更新
timer.Tick += UpdateChart;
timer.Start();
}
private void UpdateChart(object sender, EventArgs e)
{
float cpuUsage = cpuCounter.NextValue();
series.Points.AddY(cpuUsage); // 既存のシリーズにデータポイントを追加
}
}


このアプリケーションを実行すると、CPU使用率がリアルタイムでグラフに表示されます。
アラートシステムの構築
PerformanceCounterを使用して、特定の閾値を超えた場合にアラートを発生させるシステムを構築することもできます。
以下のコードは、CPU使用率が80%を超えた場合にアラートを表示する例です。
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main()
{
PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
while (true)
{
float cpuUsage = cpuCounter.NextValue();
if (cpuUsage > 80) // 80%を超えた場合
{
Console.WriteLine("アラート: CPU使用率が80%を超えました!");
}
Thread.Sleep(1000); // 1秒待機
}
}
}
このコードを実行すると、CPU使用率が80%を超えた際にコンソールにアラートメッセージが表示されます。
これにより、システムの異常を迅速に検知することが可能になります。
PerformanceCounterを活用することで、アプリケーションのパフォーマンス監視やリアルタイムデータの可視化、アラートシステムの構築が容易に行えます。
パフォーマンスの最適化
効率的なカウンターの使用
PerformanceCounterを使用する際は、必要なカウンターのみを選択し、効率的に使用することが重要です。
不要なカウンターを追加すると、リソースの無駄遣いにつながります。
以下のポイントを考慮してカウンターを選択しましょう。
- 必要な情報を明確にする: 監視したいパフォーマンス指標を明確にし、それに基づいてカウンターを選択します。
- カウンターのインスタンスを再利用する: 同じカウンターを複数回作成するのではなく、1つのインスタンスを再利用することで、オーバーヘッドを削減します。
リソース消費の最小化
PerformanceCounterを使用する際は、リソース消費を最小限に抑えるための工夫が必要です。
以下の方法でリソースの消費を抑えることができます。
- 必要なタイミングでのみデータを取得: 常にデータを取得するのではなく、特定の条件が満たされたときのみデータを取得するようにします。
- 非同期処理の活用: データ取得を非同期で行うことで、メインスレッドの負荷を軽減し、アプリケーションの応答性を向上させます。
データ取得の頻度とパフォーマンスのバランス
データ取得の頻度は、パフォーマンスに大きな影響を与えます。
頻繁にデータを取得すると、CPUやメモリの負荷が増加しますが、逆に取得頻度が低すぎると、リアルタイム性が損なわれます。
以下のポイントを考慮して、適切なバランスを見つけましょう。
- 取得間隔の調整: アプリケーションの要件に応じて、データ取得の間隔を調整します。
例えば、CPU使用率は1秒ごとに取得し、メモリ使用量は5秒ごとに取得するなど、重要度に応じて設定します。
- パフォーマンスのモニタリング: 実際のアプリケーションの動作を監視し、パフォーマンスに影響を与える要因を特定します。
必要に応じて、データ取得の頻度を見直します。
これらの最適化手法を実施することで、PerformanceCounterを使用したパフォーマンス監視がより効率的かつ効果的になります。
まとめ
この記事では、C#のPerformanceCounterを使用したパフォーマンス監視の基本から応用までを振り返りました。
具体的な使用例やパフォーマンスの最適化手法を通じて、システムやアプリケーションのパフォーマンスを効果的に監視する方法を紹介しました。
これを機に、実際のプロジェクトにPerformanceCounterを活用し、パフォーマンスの向上に取り組んでみてください。