3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.Net)任意のプロセスのCPU使用率を出すコード

任意のプロセスのCPU使用率を求めたいと思ってググっていたらVisualStudioフォーラム:複数のプロセス毎のCPU使用率同時取得にドンピシャな答えがありました。

コピペになりますが、ベンチマークソフト SUPER_PI のCPU使用率を求めたい時はこうなります。 mSystemProcessNameで、プロセスイメージ名(拡張子は無し)を指定します。 このPGでは指定したプロセスのCPU使用率しか求めれないため、全プロセスのCPU使用率を知りたい時は、一旦全プロセスイメージ名を取得して、それぞれ別スレッドでこのコードを動かすみたいな作りになろうかと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool mStop = false;
            string mSystemProcessName = "SUPER_PI";
            int mMonitorInterval = 1;
 
            /// <summary>パフォーマンスカウンタ・カテゴリ名(プロセス)</summary> 
            const string CATEGORY_NAME = "Process";
            /// <summary>パフォーマンスカウンタ・カテゴリ名(プロセッサ)</summary> 
            const string CATEGORY_NAME_PROCESSOR = "Processor";
            /// <summary>パフォーマンスカウンタ・カウンタ名(プロセッサ使用時間)</summary> 
            const string COUNTER_NAME_PROCESSOR_TIME = "% Processor Time";
            /// <summary>ナノ秒単位での1秒の値</summary> 
            double NANO_SECOND_TICKS = 10000000;
            /// <summary>CPUのコア数</summary> 
            double mCoreNumber;
 
            #region 指定時間間隔内でのデータ格納領域
            /// <summary>プロセッサ使用時間</summary> 
            double[] mDataContainer_ProcessorPercent= new double[10];
            #endregion
 
            #region 直前の監視タイミングでのデータ格納領域
            /// <summary>プロセッサ使用時間</summary> 
            double mBefor_ProcesserPercent=0;
            #endregion
 
            PerformanceCounter mProcessTime;
 
            #region CPUのコア数取得
            PerformanceCounter mWorkCounter_CoreNumber;
 
            mCoreNumber = 1;
            if (PerformanceCounterCategory.Exists(CATEGORY_NAME_PROCESSOR))
            {
                if (PerformanceCounterCategory.CounterExists(COUNTER_NAME_PROCESSOR_TIME, CATEGORY_NAME_PROCESSOR))
                {
                    for (int i = 0; i < 32; i++)
                    {
                        try
                        {
                            string wkInst = i.ToString();
                            mWorkCounter_CoreNumber = new PerformanceCounter(CATEGORY_NAME_PROCESSOR, COUNTER_NAME_PROCESSOR_TIME, wkInst, ".");
                            long buf = mWorkCounter_CoreNumber.RawValue;
                            mCoreNumber = double.Parse((i + 1).ToString());
                        }
                        catch
                        {
                            break;
                        }
                    }
                }
            }
            #endregion
 
            #region プロセスのパフォーマンスカウンタ定義
 
 
            // プロセッサ使用時間  
            mProcessTime = new PerformanceCounter(
                CATEGORY_NAME,
                COUNTER_NAME_PROCESSOR_TIME,
                mSystemProcessName,
                ".");
            #endregion
 
            // カレント時間を取得  
            DateTime current = DateTime.Now;
            // ループ  
            while (true)
            {
                // ストップフラグが設定されたらループエンド  
                if (mStop) break;
                // カレント時間の秒とが現在の秒と異なるか?  
                if (DateTime.Now.Second != current.Second)
                {
                    // カレント時間の更新  
                    current = DateTime.Now;
                    // カレント秒をログ出力間隔で割る  
                    int div_sec = current.Second % mMonitorInterval;
                    // カレント秒がログ出力間隔で割り切れるか?  
                    if (div_sec == 0)
                    {
                        //------------------------------------------------  
                        // 監視間隔が切り替わるタイミングでログ情報出力  
                        //------------------------------------------------  
                        //PutLog(current);      // ログファイルへデータ登録  
                        //InitWorkArea();         // データ格納クラスの初期化  
                    }
                    // CPU使用率 CPU使用時間(単位:100ナノ秒) / 1秒(10000000*100ナノ秒)/ CPUのコア数  
                    mDataContainer_ProcessorPercent[div_sec] = (mProcessTime.RawValue - mBefor_ProcesserPercent) / NANO_SECOND_TICKS / mCoreNumber;
                    //CPU使用率出力
                    Debug.WriteLine(mDataContainer_ProcessorPercent[div_sec]);
                    // 直前の値として退避  
                    mBefor_ProcesserPercent = mProcessTime.RawValue;
                }
                Thread.Sleep(10);
            }
        }
    }
}

参考: プロセス毎のCPU使用率の取得: DOBON.NETプログラミング掲示板過去ログ

CPU使用率(C#/VB.NET) サンプルソース ヨーキー景吾の逃走

C++でCPU使用率やメモリ使用量を調べる - 小さな星がほらひとつ C++の場合はこの方法でプロセスのCPU使用率も取れるようです。