C# で CPU 使用率を取得する

Aimen Fatima 2023年10月12日
  1. C# でのパフォーマンス監視
  2. C# でのパフォーマンス監視カウンターのデモ
C# で CPU 使用率を取得する

このチュートリアルでは、プログラムに影響を与えるパフォーマンス監視パラメーターについて詳しく説明します。 また、特に C# での CPU とメモリの使用方法についても説明します。

C# でのパフォーマンス監視

システムのメモリとプロセッサを消費するため、アプリケーション/プログラムのパフォーマンスは非常に重要です。 プログラムのパフォーマンスは、これらのパラメーター値を効率的に追跡およびカスタマイズすることで最適化できます。

システムのプロセッサは、主にシステムの CPU と密接に関係しています。 C# では、単一プロセスおよびプロセッサ全体による CPU 使用率を追跡できます。

メモリ カウンターは、メモリ管理の問題を追跡するために使用できます。名前空間 System.Diagnostics は、すべてのパフォーマンス カウンター マトリックスを実装するクラス PerformanceCounter を提供します。

この名前空間をインポートし、PerformanceCounter クラス メソッドを使用してシステムの使用状況を診断できます。 次に、いくつかのパフォーマンス カウンターとその説明を示します。

Object Name: Counter - Description という形式を使用して、次のカウンターを登録します。ここで、Object は Performance Monitor であり、Counter は PerformanceCounter クラスによってサポートされるカウンターの名前です。

プロセッサのパフォーマンス

  1. Processor: % Processor Time - このカウンターは、プロセッサーが有効なスレッドでの操作に積極的に費やした時間と、要求への応答に占有された頻度を示します。

    このカウンターは、システムが非アクティブである時間の割合を 100% で割った値を計算します。 アイドル状態になることがないため、プロセッサがこのパラメータを計算するのは簡単です。 それには常に何か関係があります。

  2. Processor: % User Time - このカウンターの値は、システムに影響を与える処理の種類を識別するのに役立ちます。 結果は、ユーザー モード操作に使用される生産的な時間の全体的な価値です。 通常、これはプログラム コードを指します。

  3. Processor: % Interrupt Time - これは、Interrupts の処理に使用されているプロセッサの時間を示します。

  4. Process: % Processor Time - このカウンターは、この特定のプロセスがプロセッサーを使用した時間の値を示します。

  5. System: % Total Processor Time - このカウンターは、すべてのプロセッサーの活動を結合することにより、システム全体のパフォーマンスを示します。 この値は、シングル プロセッサ システムの %Processor Time に等しくなります。

メモリー性能

  1. Memory: Available Memory - この数値は、ページ プールの割り当て、非ページ プールの割り当て、プロセス ワーキング セット、およびファイル システム キャッシュが完了した後も使用可能なメモリの量を示します。
  2. Memory: Committed Bytes - このカウンタは、Windows NT プロセスまたはサービスによる使用のみに割り当てられたメモリの量を示します。
  3. Memory: Page Faults/sec - このカウンターは、ページ フォールトの数を指定します。 ページ フォールトは、必要な情報がキャッシュまたは仮想メモリにない場合に発生します。
  4. Memory: Pages/sec - このカウンターは、システムがハード ドライブにアクセスしてメモリ関連データを保存または取得する頻度を示します。
  5. Process: Working Set - これは、プロセスがコード、スレッド、およびデータに使用する現在のメモリ領域のサイズを示します。

C# でのパフォーマンス監視カウンターのデモ

C# のサンプル コードを作成して、パフォーマンス監視カウンターのデモを行います。 Visual Studio または Visual Studio Code を使用して C# の空のプロジェクトを作成しましょう。

最初のステップは、Diagnostics 名前空間をプロジェクトにインポートすることです。 次のコードを使用してインポートします。

using System.Diagnostics;

クラス System.Diagnostics.PerformanceCounter のオブジェクトを作成する必要があります。 次のように、2つのオブジェクトを作成します。1つはメモリ使用量の記録用、もう 1つは CPU 使用量の記録用です。

protected static PerformanceCounter CPUCounter;
protected static PerformanceCounter memoryCounter;

次のステップは、これらのオブジェクトを初期化することです。 C# では 2つの方法でそれらを初期化できます。

  1. オブジェクトの作成時にパラメーター値を渡すことで、オブジェクトを初期化できます。 このメソッドでは、既定のコンストラクターを呼び出す必要はありません。

    例えば:

    protected static PerformanceCounter CPUCounter =
        new PerformanceCounter(Object Name, Counter, Instance);
    protected static PerformanceCounter memoryCounter = new PerformanceCounter(Category Name, Counter);
    
  2. もう 1つの方法は、new キーワードとデフォルトのコンストラクターを使用してオブジェクトを初期化することです。 パラメータ値は、変数にアクセスするためのドット識別子を使用して設定されます。

    例えば:

    // Initialize the objects
    CPUCounter = new PerformanceCounter();
    memoryCounter = new PerformanceCounter();
    
    // Assign values
    CPUCounter.CategoryName = Object Name;
    CPUCounter.CounterName = Counter;
    CPUCounter.InstanceName = Instance;
    
    memoryCounter.CategoryName = Object Name;
    memoryCounter.CounterName = Counter;
    

    初期化後、次のステップは値の計算です。 NextValue() メソッドは、カウンターの値を取得するために使用されます。

    上記で作成したそれぞれのオブジェクトを使用して、これらのメソッドを呼び出す必要があります。

    Console.WriteLine(CPUCounter.NextValue());
    

CPU とメモリの合計使用量を取得する

以下は、CPU とメモリの使用量全体を取得するための完全なコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    // create objects
    protected static PerformanceCounter CPUCounter;
    protected static PerformanceCounter memoryCounter;
    static void Main(string[] args) {
      // initialize objects
      CPUCounter = new PerformanceCounter();
      memoryCounter = new PerformanceCounter();

      // assign parameters
      CPUCounter.CategoryName = "Processor";
      CPUCounter.CounterName = "% Processor Time";
      CPUCounter.InstanceName = "_Total";

      memoryCounter.CategoryName = "Memory";
      memoryCounter.CounterName = "Available MBytes";

      // invoke the following monitoring methods
      getCpuUsage();
      getMemory();
      Console.ReadKey();
    }

    // prints the value of total processor usage time
    public static void getCpuUsage() {
      Console.WriteLine(CPUCounter.NextValue() + "%");
    }

    // prints the value of available memory
    public static void getMemory() {
      Console.WriteLine(memoryCounter.NextValue() + "MB");
    }
  }
}

上記のコード スニペットの出力は、システムの CPU 使用率 (%) と使用可能なメモリ (MB) です。

現在のプロセスの CPU およびメモリ使用量を取得する

次のコード スニペットを使用して、現在のプロセスの CPU とメモリの使用量を取得できます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    protected static PerformanceCounter CPUCounter;
    protected static PerformanceCounter memoryCounter;
    static void Main(string[] args) {
      CPUCounter = new PerformanceCounter("Process", "% Processor Time",
                                          Process.GetCurrentProcess().ProcessName);

      memoryCounter = new PerformanceCounter("Memory", "Available MBytes");

      getCpuUsage();
      getMemory();
      Console.ReadKey();
    }

    public static void getCpuUsage() {
      Console.WriteLine(CPUCounter.NextValue() + "%");
    }

    public static void getMemory() {
      Console.WriteLine(memoryCounter.NextValue() + "MB");
    }
  }
}

上記のコード スニペットの出力は、現在のプロセスで使用されているプロセッサと、システムで使用可能なメモリです。

特定のアプリケーションの CPU およびメモリ使用量を取得する

特定のアプリケーションによる CPU 使用率を取得したい場合は、PerformanceCounter コンストラクターでアプリケーション名をインスタンスとして使用できます。

PerformanceCounter("Process", "% Processor Time", app_name);

特定のアプリによる CPU 使用率を取得するための完全なサンプル コードを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace ConsoleApplication1 {
  class Program {
    static void Main(string[] args) {
      CPUUsagebyApp("chrome");
    }

    private static void CPUUsagebyApp(string app_name) {
      PerformanceCounter totalCPUUsage =
          new PerformanceCounter("Processor", "% Processor Time", "_Total");
      PerformanceCounter processCPUUsage =
          new PerformanceCounter("Process", "% Processor Time", app_name);

      // loop will be executed while you don't press the enter key from the keyboard
      // you have to press space or any other key to iterate through the loop.
      do {
        float total = totalCPUUsage.NextValue();
        float process = processCPUUsage.NextValue();

        Console.WriteLine(
            String.Format("App CPU Usage = {0} {1}%", total, process, process / total * 100));

        System.Threading.Thread.Sleep(1000);

      } while (Console.ReadKey().Key != ConsoleKey.Enter);
    }
  }
}

このコード スニペットの出力は、Chrome の合計 CPU 使用率と、パラメータとして "chrome" を渡したときの CPU 使用率になります。 詳細については、[Performance Monitoring in C#]?redirectedfrom=MSDN) を参照してください。