根据Process.TotalProcessorTime计算进程的CPU使用率

问题描述 投票:11回答:2

我一直试图摆脱使用PerformanceCounter类来监视进程的CPU使用情况,因为当进程计数相当高时(监视很多进程时,它似乎需要相当数量的CPU。) >

[我的第一种方法是使用Win32_PerfFormattedData_PerfOS_Processor类和PercentProcessorTime属性采用WMI路由,但是在尝试计算多个内核上的CPU使用率时似乎出现了问题(返回的最大值为100%,这使得它不可能根据CPU内核数对其进行划分,导致结果不准确。]

所以最后我决定使用Process的class TotalProcessorTime属性。可悲的是,我不确定如何根据该值计算进程使用的CPU使用总量的百分比。我知道我应该从先前的PercentProcessorTime值中减去当前的PercentProcessorTime值,以获取处理器在特定时限内在该进程上花费了多少时间,但是我不确定如何从那里继续。

提前感谢。

我一直试图摆脱使用PerformanceCounter类监视进程的CPU使用情况,因为当进程计数相当高时,它似乎需要相当数量的CPU(...

c# winforms process cpu-usage
2个回答
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
投票

基于111WARLOCK111的答案,您可以使用以下最少的代码来测量当前的CPU负载:

© www.soinside.com 2019 - 2024. All rights reserved.