2

私は大規模なアプリケーションに取り組んでおり、2つの時点の間でCPUがどのようにロードされたかを知りたいと思っています。私は自分のプロセスだけでなく、すべてのプロセスに興味があります。

私の考えは、2つの期間の間のアイドルプロセスの合計CPU時間を取得することです。次に、その値をリアルタイムの差と比較します。次に、アイドルプロセスに費やされた平均%CPU時間、したがって実際のプロセスに費やされた平均%CPU時間を計算することができます。

例えば:

  • リアルタイムサンプル:2012/07/30 13:56:1および2012/07/30 13:56:21
  • アイドルプロセスの合計CPU時間サンプル:56:23:10および56:23:15
  • リアルタイムの違い:20秒
  • アイドルプロセスの合計CPU時間の違い:5秒
  • アイドルプロセスの平均%CPU時間:25%
  • 実際のプロセスの平均%CPU時間:75%

パフォーマンスへの影響をできるだけ少なくするために、2つのサンプルのみを取得します。最初に1つ、最後に1つ。

また、合計CPU負荷を計算するために他のプロセスを調べたくはなく、アイドルプロセスのみを調べます。(たとえば、他のプロセスの合計CPU時間の合計を計算したくない)

Kernel32.dllOpenProcessを使おうとしました。しかし、どうやらあなたはアイドルプロセスにアクセスすることはできません。ERROR_ACCESS_DENIED例外をスローします。

タスクマネージャがアイドルプロセスの合計CPU時間を表示するため、これが可能である必要があります。

注:プロセスの瞬時%CPU時間には関心がありません。後で平均を計算するための合計CPU時間のみ。

4

2 に答える 2

3

あなたはおそらく次のようなものを探しています:

static Program
{
    private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
        CategoryName = "Processor", 
        CounterName = "% Processor Time", 
        InstanceName = "_Total" };

    static void Main()
    {
        cpuCounter.NextValue();
        // Do your processing here.
        float totalCpuUsagePercentage = cpuCounter.NextValue();
    }
}

totalCpuUsagePercentage には、最後の cpuCounter.NextValue() 以降の総負荷がパーセンテージで含まれます。

パーセンテージが必要ない場合は、代わりに CounterName = "Processor Time" を使用できます。

これがあなたの探求に役立つことを願っています。

于 2012-07-30T16:43:01.090 に答える
0

「アイドルプロセス」はおそらく存在しません。

[no. コアの] スレッド、アイドル + 1 優先度、その CPU ループ、経過時間をカウント。それはうまくいくかもしれません。

また、冷却システムに運動を与え、オフィスを暖めます:)

于 2012-07-30T15:59:33.060 に答える