学习C#——性能计数器

摘要:
今天就来学习一下使用C#是如何实现计数器的?C#如何自定义计数器前面我们学习如何使用C#调用Windows性能监视器,来获取系统的各个计数器实时数据,那么我们可不可以自己定义一个计数器,并且添加到性能监视器中供我们实时查看呢?

写在前面:

作为Web应用开发前线的一枚小兵,每看到“性能”一词总有种要亮瞎眼的感觉,说到“性能”那就不能不提“数据”,在程序猿、攻城师中不是流行这样一句话吗?“无图无真相”,谁要说谁开发的应用性能有多好多好,那么要亮瞎我们这些小兵的眼睛,就不得不拿出“数据”来说话啦,显然,我们有一个能够为我们提供“数据”的工具是多么的重要。今天就来学习一下使用C#是如何实现计数器的?(本文侧重于具体实现)

简要Windows性能监视器:

打开Windows性能监视器的步骤如下:

开始→运行→perfmon→确定

学习C#——性能计数器第1张

学习C#——性能计数器第2张

在这里我们可以选择添加我们要监控的计数器,比如:cpu使用率、内存使用量等,作为asp.net攻城师我们还可以使用它来监控我们站点的请求队列、应道队列数量、请求总数等。比如我们要开可用内存的信息:

学习C#——性能计数器第3张

可用内存大小事实数据如下:

学习C#——性能计数器第4张

瞬间感觉到在微软怀抱下的孩纸好幸福有木有。好啦接下来我们来看看C#是如何调用它的,并且是如何自定义自己的计数器的呢?

C#如何调用本地主机Windows性能监视器获取数据

上代码:

using System;
using System.Collections.Generic;
using System.Text;
//应引用此名门空间
using System.Diagnostics;
using System.Threading;

namespace Performance_Demo
{
    class Class1
    {
        static void Main(string[] arge)
        {
            //性能计数器组件类
            PerformanceCounter cpu = new PerformanceCounter("Memory", "Available MBytes", "");
            while (true)
            {
                Console.WriteLine("{0} MB",cpu.NextValue());
               
                Thread.Sleep(1000);
            }
        }
    }
}

结果如下:

学习C#——性能计数器第5张

代码很简单,最主要的就是一个PerformanceCounter类的实例cpu,PerformanceCounter类有5个构造函数重载,就代码中的构造函数讲述,构造函数为newPerformanceCounter(“计数器类型名称”,“计数器名称”,“计数器实例名称”),(如果该计数器为单实例,那么计数器实例名称可为“”)。可使用实例的NextValue()方法获取当前值。

呵呵,当你看到代码时会说“如此 so easy”,但你可能对“计数器类型名称”,“计数器名称”,“计数器实例名称”这三个名称有点糊涂啦吧,别着急,先看一张图:

学习C#——性能计数器第6张

对这张图不陌生吧,没错,添加可用内存计数器时见过,那么“1”就是“计数器类型名称”,“2”就是“计数器名称”,“3”就是“计数器实例名称”(应为该计数器是单实例的,所以“3”下面没有具体的实例),所以三者的关系我们可以归纳为:计数器类型》计数器》计数器实例。赶紧试一下吧小伙伴们。。。

C#如何调用远程主机Windows性能监视器获取数据

上代码

    class Class3
    {
        //访问远程主机的性能监视器
        static void Main(string[] arge)
        {
            //先于远程IP建立连接
            string tmpstr = "net use \\" + "172.16.164.000" + "\ipc$ " + "密码" + " /user:" + "用户名";
            RunDOS(tmpstr);

            //性能计数器组件类
            PerformanceCounter cpu = new PerformanceCounter("Memory", "Available MBytes", "", "172.16.164.215");

            while (true)
            {
                Console.WriteLine("{0} MB", cpu.NextValue());

                Thread.Sleep(1000);
            }
        }
        //使用DOS运行命令
        static void RunDOS(string DOS)
        {
            Process p = null;
            p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            string strOutput = "";
            p.StandardInput.WriteLine(DOS);
            p.StandardInput.WriteLine("exit");
            while (p.StandardOutput.EndOfStream)
            {
                strOutput = p.StandardOutput.ReadLine();
            }
            p.WaitForExit();
            p.Close();
        }
    }

代码也很简单,与调用本地主机不同之处就是多了一段运行DOS命令的代码,目的就是先与远程主机建立连接,需要指定远程主机IP、用户名、密码(可以为一般管理员身份),此时需要注意的是远程主机上的“Remote Registry”服务应处于启动状态,目的是为了能让远程用户能修改此计算机上的注册表。

C#如何自定义计数器

前面我们学习如何使用C#调用Windows性能监视器,来获取系统的各个计数器实时数据,那么我们可不可以自己定义一个计数器,并且添加到性能监视器中供我们实时查看呢?答案是肯定的。试想一下我们在日常开发当中会有类似这样的需求:我们有一个队列(可能是各种命令啊或者是消息啊、订单啊等等),那么我们想有一个可视化的东西来监控一下这个队列中积压了多少内容,当然啦我们万能的攻城师们肯定希望积压数量永远是0啦,哈哈,此时我们就可以为我们的队列设计一个计数器,那么我们就可以在Windows性能监视器中找到并且实时查看队列积压情况啦。(开始动手吧)

先上代码:

(代码就语无伦次吧,神马都不讲究啦)

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Collections;

namespace Performance_Demo
{
    class Class2
    {
        //我的队列
        static Queue<int> myQueue = new Queue<int>();
        //计数器实例
        static PerformanceCounter counter1 = null;
        static void Main(string[] arge)
        {
            

            //计数器类型名称
            string CategoryName = "a_yigebeiyiwangdebaozi";
            //计数器名称
            string CounterName = "a_yigebeiyiwangdebaozi_counter1";
            if (PerformanceCounterCategory.Exists(CategoryName))
            {
                PerformanceCounterCategory.Delete(CategoryName);
            }

            CounterCreationDataCollection ccdc = new CounterCreationDataCollection();
            //计数器
            CounterCreationData ccd = new CounterCreationData(CounterName, "myCounter", PerformanceCounterType.NumberOfItems64);
            ccdc.Add(ccd);
            //使用PerformanceCounterCategory.Create创建一个计数器类别
            PerformanceCounterCategory.Create(CategoryName, "", PerformanceCounterCategoryType.MultiInstance, ccdc);
            //初始化计数器实例
            counter1 = new PerformanceCounter();
            counter1.CategoryName = CategoryName;
            counter1.CounterName = CounterName;
            counter1.InstanceName = "myCounter1";
            counter1.InstanceLifetime = PerformanceCounterInstanceLifetime.Process;
            counter1.ReadOnly = false;
            counter1.RawValue = 0;

            while (true)
            {
                EnqueueQueue();
                System.Threading.Thread.Sleep(1000);
                DequeueQueue();
            }
        }

        static void EnqueueQueue()
        {
            int C = new Random().Next(10);
            for (int i = 0; i < C; i++)
            {
                myQueue.Enqueue(i);
                //计数器加一
                counter1.Increment();
            }
        }

        static void DequeueQueue()
        {
            int C = new Random().Next(20);
            for (int i = 0; i < C; i++)
            {
                if (myQueue.Count == 0)
                    break;
                myQueue.Dequeue();
                //计数器减一
                counter1.Decrement();
            }
            
        }
    }
}

我们先在性能监视器中找到我们的计数器如下:

学习C#——性能计数器第7张

我们队列的实时数据如下:

学习C#——性能计数器第8张

好啦,我们的计数器完成啦!

快下班啦就写到这里,如有错误请土豪们指正。

免责声明:文章转载自《学习C#——性能计数器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VUE清除组件内部定时器ORACLE恢复误删除的对象(表、存储过程等)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ArcGIS Pro 中文(简体)语言包-指定路径为空

在电脑上安装了ArcGISPro2.5,在安装中文(简体)语言包的时候,报错:指定路径为空。因此,新建立一个Chinese_CN项即可。经过上述修改,就可以成功安装中文(简体)语言包了。...

canvas基础绘制矩形(1)

1.画布基础知识画布元素是HTML5中添加的一个重要元素,专门用于绘制图形。然而,画布本身不具备绘制图形的能力。将画布元素放置在页面上相当于在页面上放置矩形“画布”。我们可以使用js脚本在“画布”上绘制图形。...

MIPS学习笔记(一)

本章涉及MIPS变量声明、数据输入和输出、地址获取、分支跳转语句,基本上对应于任何高级语言的最基本操作。该信息的确切形式因汇编程序而异。在MIPS程序集中,标签是后跟冒号的符号名称。)syscall程序的结尾与C类似,可以调用exit函数来停止程序的执行。停止MIPS程序的一种方法是使用类似于在C中调用exit的方法。MIPS中有一个移动指令,它将一个寄存器...

Excel数据透视表、高级筛选

目录:1.数据透视表:数据透视表格式和操作说明:多个表一起创建数据透视表创建组创建计算字段创建计算项值显示方法切片器2。高级过滤:高级过滤和或关系精确过滤和模糊过滤通配符过滤原则查询不重复值(使用高级过滤)高级过滤区分大小写使用高级过滤查找空数据使用高级过滤查询两个表中相同的记录或未使用的记录过滤记录1和数据透视表1.正确的数据透视表格式:① 数据源的第一行...

非线性方程(组):MATLAB内置函数 solve, vpasolve, fsolve, fzero, roots [MATLAB]

MATLAB函数求解,vpsolve,fsolve,fzero,根函数和信息概述求解函数多项式型非多项式型一维高维符号数值算法求解支持,获得所有符号解如果解可以签名,当没有符号解时获得根支持符号解方法:利用方程的性质获得标准可解函数的方法基本上是模拟手动操作vpsolve支持,获取所有数值解以获得实根支持$imes$support未知fsolve从初始值获取...

adb

ADB(AndroidDebugBridge)ANR(ApplicationNoResponding)ADB实际上是Android调试桥AndroidDebugBridge的缩写。adb是C/S体系结构的命令行工具。这里我们介绍一些常用的命令:adbdevices,获取设备列表和设备状态[xuxu:~]$adbdevicesList-devicesattac...