[英]CPU usage does not match Task Manager, PerformanceCounter or ManagementObjectSearcher
[英]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非常准確(與incManager比較)的值,盡管如果可能我想更接近。
對於內存,但它似乎不匹配,我得到一個數字,但我真正想要的是百分比像任務管理器顯示..
有幫助嗎?
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獲取此編號,如本文所示 。 如果你不想使用這個命名空間,常見的抱怨,那么你必須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");
}
您只需要獲取計算機上安裝的RAM總量和當前使用的RAM。 然后將使用過的RAM與總RAM(已使用/總數)相乘,然后將其乘以100;
如果要以%顯示已使用的RAM,則應執行以下操作:
//Pseudocode
double totalRam = TotalRam();
double ramUsed = RamUsed();
double ramPercentage = ramUsed / totalRam * 100;
使用該%值,您甚至可以獲得以%為單位的RAM
double availableRAM = 100 - ramPercentage;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.