6

タスク マネージャーに似た CPU 使用率グラフを表示 するSamurize 構成があります。

現在の CPU 使用率が最も高いプロセスの名前も表示するにはどうすればよいですか?

せいぜい1秒に1回、これを更新したいと思います。Samurize はコマンド ライン ツールを呼び出して、その出力を画面に表示できるので、これもオプションになる可能性があります。


さらなる解明:

System.Diagnostics.Process.GetProcesses() から返された配列を列挙する独自のコマンド ライン c# .NET アプリケーションの記述を調査しましたが、Process インスタンス クラスに CPU パーセンテージ プロパティが含まれていないようです。

これを何らかの方法で計算できますか?

4

8 に答える 8

6

あなたが取得したいのは、その瞬間のCPU使用率(種類)です...

実際には、プロセスの瞬間的な CPU 使用率は存在しません。代わりに、2 つの測定を行い、平均 CPU 使用率を計算する必要があります。式は非常に単純です。

AvgCpuUsed = [TotalCPUTime(プロセス、時間 2) - TotalCPUTime(プロセス、時間 1)] / [時間 2 - 時間 1]

Time2 と Time1 の差が小さいほど、測定はより「即時」になります。Windows タスク マネージャーは、1 秒間隔で CPU 使用率を計算します。これで十分であることがわかりました.5秒間隔で実行すると、測定自体がCPUサイクルを消費するため、検討することもできます...

まず、平均 CPU 時間を取得します。

    using System.Diagnostics;

float GetAverageCPULoad(int procID, DateTme from, DateTime, to)
{
  // For the current process
  //Process proc = Process.GetCurrentProcess();
  // Or for any other process given its id
  Process proc = Process.GetProcessById(procID);
  System.TimeSpan lifeInterval = (to - from);
  // Get the CPU use
  float CPULoad = (proc.TotalProcessorTime.TotalMilliseconds / lifeInterval.TotalMilliseconds) * 100;
  // You need to take the number of present cores into account
  return CPULoad / System.Environment.ProcessorCount;
}

ここで、「瞬間的な」CPU 負荷のために、特殊なクラスが必要になります。

 class ProcLoad
{
  // Last time you checked for a process
  public Dictionary<int, DateTime> lastCheckedDict = new Dictionary<int, DateTime>();

  public float GetCPULoad(int procID)
  {
    if (lastCheckedDict.ContainsKey(procID))
    {
      DateTime last = lastCheckedDict[procID];
      lastCheckedDict[procID] = DateTime.Now;
      return GetAverageCPULoad(procID, last, lastCheckedDict[procID]);
    }
    else
    {
      lastCheckedDict.Add(procID, DateTime.Now);
      return 0;
    }
  }
}

すべてのプロセスでProcess.GetProcesses静的メソッドを使用するだけの場合は、監視するプロセスごとにタイマー (または任意の間隔メソッド) からそのクラスを呼び出す必要があります。

于 2008-09-09T13:05:09.770 に答える
2

フレデリックの回答に基づいて構築し、ここのページの下部にあるコードを利用して(使用例については、この投稿を参照してください) から取得したプロセスの完全なセットに参加するとGet-Process、次のようになります。

$sampleInterval = 3

$process1 = Get-Process |select Name,Id, @{Name="Sample1CPU"; Expression = {$_.CPU}}

Start-Sleep -Seconds $sampleInterval

$process2 = Get-Process | select Id, @{Name="Sample2CPU"; Expression = {$_.CPU}}

$samples = Join-Object -Left $process1 -Right $process2 -LeftProperties Name,Sample1CPU -RightProperties Sample2CPU -Where {$args[0].Id -eq $args[1].Id}

$samples | select Name,@{Name="CPU Usage";Expression = {($_.Sample2CPU-$_.Sample1CPU)/$sampleInterval * 100}} | sort -Property "CPU Usage" -Descending | select -First 10 | ft -AutoSize

出力例を示します

Name                  CPU Usage
----                  ---------
firefox        20.8333333333333
powershell_ise 5.72916666666667
Battle.net               1.5625
Skype                    1.5625
chrome                   1.5625
chrome         1.04166666666667
chrome         1.04166666666667
chrome         1.04166666666667
chrome         1.04166666666667
LCore          1.04166666666667
于 2015-07-11T11:20:49.027 に答える
1

これにはPmon.exeを使用できる場合があります。これはWindows Resource Kit ツールの一部として入手できます(リンクは Server 2003 バージョンへのリンクで、明らかに XP でも使用できるようです)。

于 2008-09-09T12:13:35.807 に答える
1
Process.TotalProcessorTime

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.totalprocessortime.aspx

于 2008-09-09T12:31:07.887 に答える
1

式をありがとう、ホルヘ。なぜコア数で割る必要があるのか​​よくわかりませんが、取得した数値はタスク マネージャーと一致しています。これが私のpowershellコードです:

$procID = 4321

$time1 = Get-Date
$cpuTime1 = Get-Process -Id $procID | Select -Property CPU

Start-Sleep -s 2

$time2 = Get-Date
$cpuTime2 = Get-Process -Id $procID | Select -Property CPU

$avgCPUUtil = ($cpuTime2.CPU - $cpuTime1.CPU)/($time2-$time1).TotalSeconds *100 / [System.Environment]::ProcessorCount
于 2014-03-26T23:24:04.767 に答える
0

このようにすることもできます:-

public Process getProcessWithMaxCPUUsage()
    {
        const int delay = 500;
        Process[] processes = Process.GetProcesses();

        var counters = new List<PerformanceCounter>();

        foreach (Process process in processes)
        {
            var counter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName);
            counter.NextValue();
            counters.Add(counter);
        }
        System.Threading.Thread.Sleep(delay);
        //You must wait(ms) to ensure that the current
        //application process does not have MAX CPU
        int mxproc = -1;
        double mxcpu = double.MinValue, tmpcpu;
        for (int ik = 0; ik < counters.Count; ik++)
        {
            tmpcpu = Math.Round(counters[ik].NextValue(), 1);
            if (tmpcpu > mxcpu)
            {
                mxcpu = tmpcpu;
                mxproc = ik;
            }

        }
        return processes[mxproc];
    }

使用法:-

static void Main()
    {
        Process mxp=getProcessWithMaxCPUUsage();
        Console.WriteLine(mxp.ProcessName);
    }
于 2013-03-16T20:03:50.557 に答える
-3

PowerShell の場合:

Get-Process | Sort-Object CPU -desc | Select-Object -first 3 | Format-Table CPU,ProcessName -hidetableheader

次のように返します。

  16.8641632 System
   12.548072 csrss
  11.9892168 powershell
于 2008-09-09T12:56:59.290 に答える