在C#中获取进程的CPU使用率

Mar*_*rek 8 c#

我想获得特定进程的CPU使用率..

这段代码

total_cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Run Code Online (Sandbox Code Playgroud)

效果很好.该数字对应于Windows" 任务管理器 "中的"CPU使用率"编号.

但以下给了我奇怪的数字......

process_cpu = new PerformanceCounter("Process", "% Processor Time", "gta_sa");
var process_cpu_usage = (total_cpu_usage.NextValue() / 100) * process_cpu.NextValue();
Run Code Online (Sandbox Code Playgroud)

正如你在屏幕截图中看到的(而不是"7",我得到的是"2,9 ..").

流程

ken*_*n2k 12

实际上,Process \%Processor Time\Instance计数器返回受监视进程在单个处理器的%User time上使用的时间百分比.所以限制是你拥有的处理器数量的100%*.

似乎没有一种简单的方法来计算taskmgr使用perfmon计数器显示的值.看到这个链接.

还要记住CPU使用率不是固定值,而是计算值:

((total processor time at time T2) - (total processor time at time T1) / (T2 - T1))
Run Code Online (Sandbox Code Playgroud)

这意味着该值取决于T2和T1,所以有可能是你看到任务管理器什么,你计算一下,如果T2和T1通过任务管理器使用的是比T1和T2的程序中使用略有不同的差异.


如果您有兴趣,我可以提供一些代码来使用P/Invoke检索此值.但是会失去性能计数器的好处(例如监视远程进程).


Jos*_*yes 8

在与任务管理器进行比较时,除以处理器/核心数量似乎会产生相当准确的结果.

为了节省人们的时间:

// This will return the process usage as a percent of total processor utilisation.
var processUsage = process_cpu_usage/nextValue() / Environment.ProcessorCount;
Run Code Online (Sandbox Code Playgroud)