zoukankan      html  css  js  c++  java
  • 使用性能计数器,获取系统性能数据

      在代码调试过程中,我们往往都需要去观察程序的状况和计算机的状态,以评估程序对计算机性能的影响。那如何程序或者计算机的性能数据?

    1、Process 数据

      Process的数据可以看进程的相关使用情况,通过Process.GetCurrentProcess()获得当前程序的Process,然后打印相关数据。

    Dictionary<string, string> DicPerfm = new Dictionary<string, string>
    {
        { "ProcessName", ps.ProcessName },
        { "TotalProcessorTime(ms)", ps.TotalProcessorTime.TotalMilliseconds.ToString() + "ms" },
        { "UserProcessorTime(ms)", ps.UserProcessorTime.TotalMilliseconds.ToString() + "ms" },
        { "Kernal Time(ms)", (ps.TotalProcessorTime.TotalMilliseconds - ps.UserProcessorTime.TotalMilliseconds).ToString() + "ms" },
        { "Physical Memory Working Set", (ps.WorkingSet64 / 1024 / 1024).ToString() + "MB" },
        { "Virtual Memory Virtual Size", (ps.VirtualMemorySize64 / 1024 / 1024).ToString() + "MB" }
    };
    
    foreach (var item in DicPerfm)
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }

    2、PerformanceCounter 性能计数器

      PerformanceCounter 是C#提供的一个可以监控并获取计算机某些性能的类,诸如网络速度、硬盘读写速度、内存使用、计算机CPU温度等等。

      构造一个PerformanceCounter对象,并对CategoryName、CounterName 、InstanceName 分别进行赋值,就可以监控计算机的某种数据。其NextValue()方法返回当前计数结果值。

      如果对不知道有哪些类别,可以使用PerformanceCounterCategory获得相关类别和计数器实例:

    PerformanceCounterCategory[] pcc = PerformanceCounterCategory.GetCategories();
    
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < pcc.Length; i++)
    {
        sb.Remove(0, sb.Length);
        sb.Append("CategoryName:" + pcc[i].CategoryName + "
    ");
        sb.Append("MachineName:" + pcc[i].MachineName + "
    ");
        string[] instanceNames = pcc[i].GetInstanceNames();
        for (int j = 0; j < instanceNames.Length; j++)
        {
    
            sb.Append("**** Instance Name **********
    ");
            sb.Append("InstanceName:" + instanceNames[j] + "
    ");
            try
            {
                PerformanceCounter[] counters = pcc[i].GetCounters(instanceNames[j]);
                for (int k = 0; k < counters.Length; k++)
                {
                    sb.Append("CounterName:" + counters[k].CounterName + "
    ");
                }
            }
            catch (Exception)
            { }
            sb.Append("**************************************************
    ");
        }
        Console.WriteLine(sb.ToString());
    }

    3、获取CPU、内存、硬盘读写速率

      使用PerformanceCounter统计CPU、内存、硬盘使用情况:

      首先声明性能计数器实例,并初始化实例数据:

    static private PerformanceCounter cpuPerformanceCounter = new PerformanceCounter();//CPU的使用监控
    static private PerformanceCounter memoryPerformanceCounter = new PerformanceCounter();//内存使用监控
    static private PerformanceCounter diskReadsPerformanceCounter = new PerformanceCounter();//硬盘读取速度监控
    static private PerformanceCounter diskWritesPerformanceCounter = new PerformanceCounter();//硬盘写入速度监控
    static private PerformanceCounter diskTransfersPerformanceCounter = new PerformanceCounter();//硬盘传输速度监控
    //初始化性能监控器
    private static void InitPerformanceCounters()
    {
        cpuPerformanceCounter.CategoryName = "Processor";
        cpuPerformanceCounter.CounterName = "% Processor Time";
        cpuPerformanceCounter.InstanceName = "_Total";
    
        memoryPerformanceCounter.CategoryName = "Memory";
        memoryPerformanceCounter.CounterName = "Available MBytes";
    
        diskReadsPerformanceCounter.CategoryName = "PhysicalDisk";
        diskReadsPerformanceCounter.CounterName = "Disk Reads/sec";
        diskReadsPerformanceCounter.InstanceName = "_Total";
    
        diskWritesPerformanceCounter.CategoryName = "PhysicalDisk";
        diskWritesPerformanceCounter.CounterName = "Disk Writes/sec";
        diskWritesPerformanceCounter.InstanceName = "_Total";
    
        diskTransfersPerformanceCounter.CategoryName = "PhysicalDisk";
        diskTransfersPerformanceCounter.CounterName = "Disk Transfers/sec";
        diskTransfersPerformanceCounter.InstanceName = "_Total";
    }

      在输出时,需要调用NextValue()方法,可以获得计数周期内的数据:

    //打印性能
    static private void PrintPerformanceData()
    {
        string currentCpuUsage = "CPU Usage : " + cpuPerformanceCounter.NextValue().ToString() + " %" + Environment.NewLine;
        string currentMemoryUsage = "Memory Usage : " + memoryPerformanceCounter.NextValue().ToString() + " Mb" + Environment.NewLine;
        string currentDiskReads = "Disk reads / sec : " + diskReadsPerformanceCounter.NextValue().ToString() + Environment.NewLine;
        string currentDiskWrites = "Disk writes / sec : " + diskWritesPerformanceCounter.NextValue().ToString() + Environment.NewLine;
        string currentDiskTransfers = "Disk transfers / sec : " + diskTransfersPerformanceCounter.NextValue().ToString() + Environment.NewLine;
    
        Console.Write("{0}{1}{2}{3}{4}", currentCpuUsage, currentMemoryUsage, currentDiskReads, currentDiskWrites, currentDiskTransfers);
    }

    4、获取实时网络速度

    public class NetworkAdapter
    {
        public string Name { get; private set; }
        public NetworkAdapter(string name)
        {
            Name = name;
            PerformanceCounter bandwidth = new PerformanceCounter("Network Interface", "Current Bandwidth", name);
            receive = new PerformanceCounter("Network Interface", "Bytes Received/sec", name);
            send = new PerformanceCounter("Network Interface", "Bytes Sent/sec", name);
            BandwidthKbps = bandwidth.NextValue() / 1000 ;
        }
    
        PerformanceCounter receive;
        public double DownloadSpeedKbps
        {
            get
            {
                return receive.NextValue() / 1000;//bps=>kpbs
            }
        }
    
    
        PerformanceCounter send;
        public double UploadSpeedKbps
        {
            get
            {
                return send.NextValue() / 1000;//bps=>kpbs
            }
        }
    
        public float BandwidthKbps { get; private set; }//网络带宽
    }
    
    
    private static List<NetworkAdapter> GetNetworkAdapters()
    {
        //方法1
        //NetworkInterface[] networks = NetworkInterface.GetAllNetworkInterfaces();
        //List<string> lstAdapters = new List<string>();
        //foreach (NetworkInterface adapter in networks)
        //{
        //    lstAdapters.Add(adapter.Description);
        //}
    
        //方式二
        //List<NetworkAdapter> networkAdapters = new List<NetworkAdapter>();
        //PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
        //foreach (string name in category.GetInstanceNames())
        //{
        //    // This one exists on every computer.
        //    if (name.Contains("Loopback Interface"))
        //    {
        //        continue;
        //    }
        //    networkAdapters.Add(new NetworkAdapter(name));
        //}
    
        //方式三
        List<NetworkAdapter> networkAdapters = new List<NetworkAdapter>();
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter WHERE NetConnectionStatus=2");
        ManagementObjectCollection adapterObjects = searcher.Get();
        foreach (ManagementObject adapterObject in adapterObjects)
        {
            string name = adapterObject["Name"].ToString();
            networkAdapters.Add(new NetworkAdapter(name));
        }
    
        return networkAdapters;
    }
    
    
    
    public void PrintNetworkSpeed()
    {
        List<NetworkAdapter> adapters = GetNetworkAdapters();
        foreach (NetworkAdapter adapter in adapters)
        {
            Console.WriteLine("Adapter Name: {0}", adapter.Name);
            Console.WriteLine(String.Format("Download: {0:n} Kbps upload: {1:n} Kbps", adapter.DownloadSpeedKbps, adapter.UploadSpeedKbps));
        }
    }
    凡所有相,皆是虚妄。
  • 相关阅读:
    socketserver源码简介
    Python中实现switchcase
    maven知识整理
    架构师成长之路(5)--如何获取知识(方法)
    架构师成长之路(4)--知识体系(方法)
    python 定义函数
    Git 使用规范流程
    Mybatis内置的日志工厂提供日志功能
    Log4j配置详解
    【log4j2 加载配置文件】 加载配置文件的三种方法
  • 原文地址:https://www.cnblogs.com/pilgrim/p/15170364.html
Copyright © 2011-2022 走看看