PerformanceCounter CPU 和内存,如任务管理器

Posted

技术标签:

【中文标题】PerformanceCounter CPU 和内存,如任务管理器【英文标题】:PerformanceCounter CPU & Memory like Task Manager 【发布时间】:2018-07-18 01:41:29 【问题描述】:

我正在尝试同时监控 CPU 和内存并获得与 TaskManager 值匹配的值(或尽可能接近)。到目前为止,我有:

static readonly PerformanceCounter IdleCounter = new PerformanceCounter("Processor", "% Idle Time", "_Total");
static readonly PerformanceCounter RamCounter = new PerformanceCounter("Memory", "Available MBytes");

public string f() 
  return "cpu: " + (100-IdleCounter.NextValue()) + " , ram: " + RamCounter.NextValue() + "MB";

这为 cpu 提供了非常准确的(与 TaskManager 相比的 inc 值),但如果可能的话,我希望更接近。 对于内存,但它似乎不匹配,我得到一个数字,但我真正想要的是任务管理器显示的百分比..

有什么帮助吗?

【问题讨论】:

对于内存百分比只需查询总内存并除以。 ***.com/questions/105031/… 这是一个通过 PID 获取 CPU 的酷网站。 weblog.west-wind.com/posts/2014/Sep/27/… 或许可以看看***.com/a/10028263/6730162 【参考方案1】:
   public string f()

要做的最重要的事情是以与任务管理器相同的速率对这些性能计数器进行采样。对于% Idle Time 尤其如此,这是一个粒度为 1/64 秒的数字。请务必使用 Timer 或 DispatcherTimer,将其 Interval 设置为 1000。

  ... new PerformanceCounter("Processor", "% Idle Time", "_Total")

您需要使用不同的计数器,类别为“处理器信息”。该计数器使用一种略有不同的策略来测量性能,它试图补偿超线程内核的不平等行为和处理器时钟频率限制的副作用。我的机器上的差异约为 4%。请注意,很难获得完全匹配,数字变化很快,您只是偶然与任务管理器的采样时间完全同步。

  ... new PerformanceCounter("Memory", "Available MBytes")

要将其转换为百分比,您需要从可用的物理 RAM 总量中减去该数字。您可以从ComputerInfo.TotalPhysicalMemory 获取此号码,如this post 中所示。如果你不想使用这个命名空间,常见的投诉,那么你必须pinvoke GlobalMemoryStatusEx()。

我用来验证这些更改的代码:

private void timer1_Tick(object sender, EventArgs e) 
    label1.Text = IdleCounter.NextValue().ToString("N0");
    double total = new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
    var used = 1024.0 * 1024.0 * RamCounter.NextValue();
    label2.Text = (100.0 * (total - used) / total).ToString("N0");

【讨论】:

【参考方案2】:

您只需要获取安装在计算机上的 RAM 总量和当前使用的 RAM。然后将已用 RAM 与总 RAM(已用/总)相除,然后乘以 100;

如果您想以 % 显示已使用的 RAM,您应该执行以下操作:

//Pseudocode
double totalRam = TotalRam();
double ramUsed = RamUsed();
double ramPercentage = ramUsed / totalRam * 100;

使用该 % 值,您甚至可以获得 % 中可用的 RAM

double availableRAM = 100 - ramPercentage;

【讨论】:

以上是关于PerformanceCounter CPU 和内存,如任务管理器的主要内容,如果未能解决你的问题,请参考以下文章

使用 PerformanceCounter 获取进程的 CPU 使用率

PerformanceCounter 报告的 CPU 使用率高于观察到的情况

PerformanceCounter 报告的 CPU 使用率高于观察到的情况

PerformanceCounter CPU 和内存,如任务管理器

CPU 使用率与任务管理器、PerformanceCounter 或 ManagementObjectSearcher 不匹配

为啥调用 PerformanceCounter 很慢?