2013-11-03 154 views
9

我一直在試圖擺脫使用PerformanceCounter類來監視進程的CPU使用率,因爲當進程數量變得非常高時(監視時,它似乎需要大量的CPU很多進程)。從Process.TotalProcessorTime計算進程cpu使用率

我的第一種方法是採用Win32_PerfFormattedData_PerfOS_Processor類和PercentProcessorTime屬性的WMI路由,但似乎有一個問題,當試圖計算多個核心的CPU使用率時(它返回的最大值是100%,這使得它不可能根據CPU內核數量進行劃分,導致結果不準確)。

因此最後我決定使用Process的類TotalProcessorTime屬性。令人遺憾的是,我不確定如何根據該值計算Process使用的總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.Ticks而不是TimeStamp.TotalSeconds減少分數損失 – Jan