PerformanceCounter CPU和内存(如任务管理器)

时间:2018-07-18 01:41:30

标签: c# performancecounter

我正在尝试同时监视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的比较),尽管我想尽可能地接近。

对于内存,但是似乎不匹配,我得到了一个数字,但我真正想要的是百分比,如“任务管理器”显示..

有帮助吗?

2 个答案:

答案 0 :(得分:1)

   public string f()

要做的最重要的事情是以与任务管理器相同的速率对这些性能计数器进行采样。特别是对于% Idle Time,该数字具有1/64秒的粒度。确保使用Timer或DispatcherTimer,并将其时间间隔设置为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");
}

答案 1 :(得分:-1)

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

如果要以%显示已用RAM,则应执行以下操作:

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

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

double availableRAM = 100 - ramPercentage;