2013-11-03 35 views
9

私は、プロセスのCPU使用量を監視するためにPerformanceCounterクラスを使用しないようにしました。これは、プロセスカウントが非常に高くなった場合、多くのプロセス)。プロセスのCPU使用量をProcess.TotalProcessorTimeから計算する

私の最初のアプローチは、Win32_PerfFormattedData_PerfOS_ProcessorクラスとPercentProcessorTimeプロパティを使用してWMIルートをとることでしたが、複数のコアでCPU使用率を計算しようとしたときに問題があるようです(返す最大値は100% CPUのコア数に基づいてそれを分割すると不正確な結果になります)。

最後に、プロセスのクラスTotalProcessorTimeプロパティを使用することにしました。残念ながら私は、その値に基づいてプロセスによって使用される合計CPU使用率のパーセンテージを計算する方法がわかりません。以前のPercentProcessorTime値から現在のPercentProcessorTime値を差し引いて、プロセッサが一定の時間内にプロセスに費やした時間を取得する必要があることを知っていますが、そこから続行する方法がわかりません。

ありがとうございます。

答えて

16
class GetCPUUsage 
{ 
    static TimeSpan start; 
    public static double CPUUsageTotal 
    { 
     get; 
     private set; 
    } 

    public static double CPUUsageLastMinute 
    { 
     get; 
     private set; 
    } 

    static TimeSpan oldCPUTime = new TimeSpan(0); 
    static DateTime lastMonitorTime = DateTime.UtcNow; 
    public static DateTime StartTime = DateTime.UtcNow; 
    // Call it once everything is ready 
    static void OnStartup() 
    { 
     start = Process.GetCurrentProcess().TotalProcessorTime; 
    } 

    // Call this every 30 seconds 
    static void CallCPU() 
    { 
     TimeSpan newCPUTime = Process.GetCurrentProcess().TotalProcessorTime - start; 
     CPUUsageLastMinute = (newCPUTime - oldCPUTime).TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(lastMonitorTime).TotalSeconds); 
     lastMonitorTime = DateTime.UtcNow; 
     CPUUsageTotal = newCPUTime.TotalSeconds/(Environment.ProcessorCount * DateTime.UtcNow.Subtract(StartTime).TotalSeconds); 
     oldCPUTime = newCPUTime; 
    } 
} 

class GetCPUInfo 
{ 
    public static string GetInfoMinute() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageLastMinute * 100); 
    } 

    public static string GetInfoTotal() 
    { 
     return String.Format("{0:0.0}", GetCPUUsage.CPUUsageTotal * 100); 
    } 
} 
+0

テストサンプルも提供できますか? – Demodave

+0

分数の損失が少ないため、TimeStamp.TotalSecondsの代わりにTimeStamp.Ticksを使用します。 – Jan

関連する問題