c# - PerformanceCounter CPU & Memory 类似任务管理器

标签 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 的比较),但如果可能的话我想更接近。

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

有什么帮助吗?

最佳答案

   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");
}

关于c# - PerformanceCounter CPU & Memory 类似任务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51392374/

相关文章:

c# - 在通用词典中找不到键

c# - ASP.NET Core 中 AsyncLocal 的安全性

c++ - 这个时钟滴答适用于 Intel i3 吗?

ARM Cortex-a9 事件计数器返回 0

c# - 性能计数器的使用

c# - 如何重置自定义性能计数器

c# - 使用 VS2010 在混合 C# C(win32) 项目中没有加载符号

c# - 我们可以在 WPF 中使用 LINQ 进行聚合和分组吗?

c# - 使用gecko navigate时屏蔽image, flash, style的方法?

c# - PerformanceCounterCategory.GetCategories 与 Perfmon 不一致