PerformanceCounter CPU & Memory like 任务管理器
PerformanceCounter CPU & Memory like Task Manager
我正在尝试同时监视 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 的比较),但如果可能的话我想更接近。
对于内存,但它似乎不匹配,我得到一个数字,但我真正想要的是任务管理器显示的百分比 ..
有什么帮助吗?
您只需要获取计算机上安装的 RAM 总量和当前使用的 RAM。然后将使用的RAM除以总RAM(used/total),然后乘以100;
如果您想以 % 显示已用 RAM,您应该这样做:
//Pseudocode
double totalRam = TotalRam();
double ramUsed = RamUsed();
double ramPercentage = ramUsed / totalRam * 100;
使用该 % 值,您甚至可以获得 %
中可用的 RAM
double availableRAM = 100 - ramPercentage;
public string f()
最重要的事情是以与任务管理器相同的速率对这些性能计数器进行采样。特别是 % Idle Time
,一个粒度为 1/64 秒的数字。请务必使用 Timer 或 DispatcherTimer,将其 Interval 设置为 1000。
... new PerformanceCounter("Processor", "% Idle Time", "_Total")
您需要使用不同的计数器,类别 "Processor Information"。该计数器使用一种略有不同的策略来测量性能,它试图补偿超线程内核的不平等行为和处理器时钟频率节流的副作用。在我的机器上,差异约为 4%。请注意,很难获得精确匹配,数字变化很快,您只是偶然与任务管理器的采样时间完全同步。
... new PerformanceCounter("Memory", "Available MBytes")
要将其转换为百分比,您需要从可用的物理 RAM 总量中减去该数字。您可以从 ComputerInfo.TotalPhysicalMemory as demonstrated in this post. If you don't want to use this namespace, common complaint, then you have to 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");
}
我正在尝试同时监视 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 的比较),但如果可能的话我想更接近。
对于内存,但它似乎不匹配,我得到一个数字,但我真正想要的是任务管理器显示的百分比 ..
有什么帮助吗?
您只需要获取计算机上安装的 RAM 总量和当前使用的 RAM。然后将使用的RAM除以总RAM(used/total),然后乘以100;
如果您想以 % 显示已用 RAM,您应该这样做:
//Pseudocode
double totalRam = TotalRam();
double ramUsed = RamUsed();
double ramPercentage = ramUsed / totalRam * 100;
使用该 % 值,您甚至可以获得 %
中可用的 RAMdouble availableRAM = 100 - ramPercentage;
public string f()
最重要的事情是以与任务管理器相同的速率对这些性能计数器进行采样。特别是 % Idle Time
,一个粒度为 1/64 秒的数字。请务必使用 Timer 或 DispatcherTimer,将其 Interval 设置为 1000。
... new PerformanceCounter("Processor", "% Idle Time", "_Total")
您需要使用不同的计数器,类别 "Processor Information"。该计数器使用一种略有不同的策略来测量性能,它试图补偿超线程内核的不平等行为和处理器时钟频率节流的副作用。在我的机器上,差异约为 4%。请注意,很难获得精确匹配,数字变化很快,您只是偶然与任务管理器的采样时间完全同步。
... new PerformanceCounter("Memory", "Available MBytes")
要将其转换为百分比,您需要从可用的物理 RAM 总量中减去该数字。您可以从 ComputerInfo.TotalPhysicalMemory as demonstrated in this post. If you don't want to use this namespace, common complaint, then you have to 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");
}