代码比较简单直接上了,官网的示例在这个链接里
https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfrawdata
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SystemInfo
class Program
static void Main(string[] args)
List<double> cpuMeans = new List<double>();
List<double> memoryMeans = new List<double>();
List<double> cpuMeanToMeans = new List<double>();
var obj = new ManagementObjectSearcher("select * from Win32_PhysicalMemory");
ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor");
double physicalMemory = GetPhysicalMemory();
while (true)
#region cpu
var cpuTimes = searcher.Get()
.Cast<ManagementObject>()
.Select(mo => new
Name = mo["Name"],
Usage = mo["PercentProcessorTime"]
.ToList();
var query = cpuTimes.Where(x => x.Name.ToString() == "_Total").Select(x => x.Usage);
cpuMeans.Add(double.Parse((query.SingleOrDefault().ToString())));
double mean = cpuMeans.Sum() / cpuMeans.Count();
#endregion
#region memory
ObjectQuery objectQueryUseTotalMemory = new ObjectQuery("select * from Win32_PerfRawData_PerfOS_Memory");
ManagementObjectSearcher searcherUseTotalMemory = new ManagementObjectSearcher(objectQueryUseTotalMemory);
memoryMeans.Add(GetUseTotalMemoryPercentage(physicalMemory, searcherUseTotalMemory));
var memoryMean = memoryMeans.Sum() / memoryMeans.Count();
#endregion
if (cpuMeans.Count() > 120)
cpuMeanToMeans.Add(mean);
cpuMeans.RemoveAt(0);
if(cpuMeanToMeans.Count() > 120)
Console.WriteLine("\r\n测试结果:平均cpu使用率:" + (cpuMeanToMeans.Sum()/ cpuMeanToMeans.Count()).ToString("F2") + "%" + " 平均内存使用率:" + memoryMean.ToString("F2") + "%\r\n");
break;
Console.WriteLine("当前cpu使用率:" + query.SingleOrDefault().ToString() + "%" + " 平均cpu使用率:" + (mean).ToString("F2") + "%" + " 平均内存使用率:" + memoryMean.ToString("F2") + "%" + " count:"+ cpuMeans.Count().ToString() + " meanCount:" + cpuMeanToMeans.Count().ToString());
Thread.Sleep(500);
catch(Exception ex)
Console.WriteLine(ex.Message);
public static double GetUseTotalMemoryPercentage(double physicalMemory, ManagementObjectSearcher searcherUseTotalMemory)
double useTotalMemoryPercentage = ((physicalMemory - GetUseTotalMemory(searcherUseTotalMemory)) / physicalMemory) * 100;
return useTotalMemoryPercentage;
public static double GetUseTotalMemory(ManagementObjectSearcher searcherUseTotalMemory)
double totalCapacity = 0;
ManagementObjectCollection vals = searcherUseTotalMemory.Get();
foreach (ManagementObject val in vals)
totalCapacity += System.Convert.ToDouble(val.GetPropertyValue("Availablebytes"));
double ramCapacity = totalCapacity / 1048576;
return ramCapacity;
public static double GetPhysicalMemory()
double totalCapacity = 0;
ObjectQuery objectQueryPhysicalMemory = new ObjectQuery("select * from Win32_PhysicalMemory");
ManagementObjectSearcher searcherPhysicalMemory = new ManagementObjectSearcher(objectQueryPhysicalMemory);
ManagementObjectCollection vals = searcherPhysicalMemory.Get();
foreach (ManagementObject val in vals)
totalCapacity += System.Convert.ToDouble(val.GetPropertyValue("Capacity"));
double ramCapacity = totalCapacity / 1048576;
return ramCapacity;