PerformanceCounter 基本介绍以及示例方法

一 PerformanceCounter 基本介绍
1 简单介绍
表示 Windows NT 性能计数器组件
命名空间:System.Diagnostics
程序集:System(在 system.dll 中)
2 构造函数(只介绍本文要用到的)
PerformanceCounter (String, String, String)
功能:
初始化 PerformanceCounter 类的新的只读实例,
并将其与本地计算机上指定的系统性能计数器或自定义性能计数器及类别实例关联
参数说明:
public PerformanceCounter (
 string categoryName,
 string counterName,
 string instanceName
)
categoryName
性能计数器关联的性能计数器类别(性能对象)的名称。
counterName
性能计数器的名称。
instanceName
性能计数器类别实例的名称,或者为空字符串 ("")(如果该类别包含单个实例)。
二 示例方法:
需要引用命名空间

using  System.Diagnostics;
using  System.Threading;
using  System.Collections;

1 获取性能计数器类别列表
虽然系统中有很多可用的计数器类别,但与之交互最频繁的可能是“Cache”(缓存)、“Memory”(内存)、
“Objects”(对象)

、“PhysicalDisk”(物理磁盘)、“Process”(进程)、“Processor”(处理器)、
“Server”(服务器)、“System”(系统)和“Thread”(线程)等类别

         public   static   void  GetCategoryNameList()
        {
            PerformanceCounterCategory[] myCat2;
            myCat2  =  PerformanceCounterCategory.GetCategories();
             for  ( int  i  =   0 ; i  <  myCat2.Length; i ++ )
            {
                Console.WriteLine(myCat2[i].CategoryName.ToString());
            }
        }

2 获取性能计数器类别下的实例的名称实例下的性能计数器的名称

         public   static   void  GetInstanceNameListANDCounterNameList( string  CategoryName)
        {
             string [] instanceNames;
            ArrayList counters  =   new  ArrayList();
            PerformanceCounterCategory mycat  =   new  PerformanceCounterCategory(CategoryName);
             try
            {
                instanceNames  =  mycat.GetInstanceNames();
                 if  (instanceNames.Length  ==   0 )
                {
                    counters.AddRange(mycat.GetCounters());
                }
                 else
                {
                     for  ( int  i  =   0 ; i  <  instanceNames.Length; i ++ )
                    {
                        counters.AddRange(mycat.GetCounters(instanceNames[i]));
                    }
                }
                 for  ( int  i  =   0 ; i  <  instanceNames.Length; i ++ )
                {
                    Console.WriteLine(instanceNames[i]);
                }
                Console.WriteLine( " ****************************** " );
                 foreach  (PerformanceCounter counter  in  counters)
                {
                    Console.WriteLine(counter.CounterName);
                }
            }
             catch  (Exception)
            {
                Console.WriteLine( " Unable to list the counters for this category " );
            }
        }

3 根据categoryName,counterName,instanceName获得性能情况显示

         private   static   void  PerformanceCounterFun( string  CategoryName,  string  InstanceName,  string  CounterName)
        {
            PerformanceCounter pc  =   new  PerformanceCounter(CategoryName, CounterName, InstanceName);
             while  ( true )
            {
                Thread.Sleep( 1000 );  //  wait for 1 second 
                 float  cpuLoad  =  pc.NextValue();
                Console.WriteLine( " CPU load =  "   +  cpuLoad  +   "  %. " );
            }
        }

4 调用方法3显示cpu使用率

PerformanceCounterFun( " Processor " ,  " _Total " ,  " % Processor Time " );

Performance Counter的使用

 

客户端性能测试通过performanceCounter监控客户端性能指标

PerformanceCounter PTCounter = new PerformanceCounter("Process",
                                        "% Processor Time",
                                         "AliIM");
            logfile("% Processor Time:" + PTCounter.NextValue().ToString());
            //内存
            PerformanceCounter WSCounter = new PerformanceCounter("Process",
                                                                    "Working Set",
                                                                     "AliIM");
            logfile("Working Set:" + ((double)WSCounter.NextValue() / 1024).ToString());

//内存最高值
            PerformanceCounter MemeryCounter = new PerformanceCounter("Process",
                                                                    "Working Set Peak",
                                                                     "AliIM");
            logfile("Working Set Peak:" + ((double)MemeryCounter.NextValue() / 1024).ToString());

//虚拟内存
            PerformanceCounter PBCounter = new PerformanceCounter("Process",
                                                              "Private Bytes",
                                                               "AliIM");
            logfile("Private Bytes:" + ((double)PBCounter.NextValue() / 1024).ToString());

//句柄数
            PerformanceCounter HCCounter = new PerformanceCounter("Process",
                                                  "Handle Count",
                                                   "AliIM");
            logfile("Handle Count:" + HCCounter.NextValue() .ToString());

//线程数Thread Count
            PerformanceCounter TCCounter = new PerformanceCounter("Process",
                                      "Thread Count",
                                       "AliIM");
            logfile("Thread Count:" + TCCounter.NextValue() .ToString());

//补充得到GDI OBJECTS

Process process;
            process = System.Diagnostics.Process.GetProcessesByName("AliIM")[0];
           
            logfile("GDI Objects Count:" + GetGuiResources(process.Handle, 0));

[DllImport("User32")]

extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);

通过编码方式使用性能计数器来进行性能计数的一个简单例子

比如我们有这样一个需求:
我要编码方式记录我们当前编写的程序每秒钟抛出异常数

如果我们直接使用 Performance 工具,就是采用下图方式依次选择:

1、选择要做性能测试的计算机
2、选择要用那个 Proformance object; 这里我们选择: .NET CLR Exceptions
3、选择 需要的计数项,这里我们选 # of Exceps Thrown / sec
4、选择你要对那个程序进行测试(也就是那个进程产生的异常),在这里就请选择你要测试的程序名字

如果我们希望用编码方式来实现这个功能的话,也很简单:
System.Diagnostics.PerformanceCounter 就是编码获得性能计数的核心
这部分的代码如下:

System.Diagnostics.PerformanceCounter pc = new PerformanceCounter();

// 获取或设置此性能计数器的性能计数器类别的名称。

pc.CategoryName = ".NET CLR Exceptions";

// 获取或设置与此 PerformanceCounter 实例关联的性能计数器的名称。

pc.CounterName = "# of Exceps Thrown / sec";

// 获取或设置此性能计数器的实例名称。

pc.InstanceName =

System.IO.Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.SetupInformation.ApplicationName);

pc.ReadOnly = true;

Console.WriteLine(pc.RawValue);

Console.WriteLine(pc.NextValue());

int num = 30;

for (int i = 0; i < num; i++)

{

try

{

throw new Exception("test Exception");

}

catch (Exception)

{

}

}

// 获取或设置此计数器的原始值(即未经过计算的值)。

Console.WriteLine(pc.RawValue);

// 获取计数器样本并为其返回计算所得值。

Console.WriteLine(pc.NextValue());

Console.WriteLine("===========");

上述代码只是一个超简单的例子,实际性能计数可以写得比这个更复杂。
这时候,你可以参考以下几个类:

说明

System.Diagnostics.PerformanceCounter

表示 Windows NT 性能计数器组件。使用该类读取现有预定义的或自定义的计数器并向自定义计数器发布(写入)性能数据。

System.Diagnostics.PerformanceCounterCategory

提供与计数器交互的几种方法以及该计算机上计数器的类别。

System.Diagnostics.PerformanceCounterInstaller

指定 PerformanceCounter 组件的安装程序。

System.Diagnostics.PerformanceCounterType

指定用于计算 PerformanceCounterNextValue 方法的公式。

附:

我们这个例子中需要做的性能计数器:

# of Exceps Thrown / Sec(引发的异常数/秒)

显示每秒引发的异常的数目。它包括 .NET 异常和转换成 .NET 异常的非托管异常。例如,从非托管代码返回的 HRESULT 转换为托管代码中的异常。
此计数器包括已处理和未处理的异常。此计数器不是一段时间内的平均值;它显示在最后两个样本(以取样间隔持续时间来划分)中观察到的值之间的差异。此计数器是一个潜在性能问题(如果引发多于 100 个的较多数目的异常)的指示器。

Performance Counter的使用误区

2008-07-11 20:42

很多人在使用PerfomanceCounter的时候直接new PerfomanceCounter实例,然后就去调用NextValue()方法。这样往往得到的值是0.00,今天我也犯了这么错误,找个了半天,终于发现,performance counter在计算值得时候,需要两个样本,如果我们获取到PerformanceCounter后直接调用NextValue()方法,则只会获取到第一个样本的值,该值往往会是0。

下面告诉大家正确的代码是:
PerformanceCounter pc = new PerformanceCounter();
            pc.CategoryName = cataName;
            pc.CounterName = counter;
            pc.InstanceName = instance;
            pc.MachineName = ".";
            pc.ReadOnly = true;
           
           pc.NextValue();
            System.Threading.Thread.Sleep(1000); //等1秒,让后系统获取下一个样本

return pc.NextValue();

其实,如果你的对象不销毁,下次再获取的时候就不会为0了,也就不需要再sleep(1000),只要你两次调用NextValue的时间间隔大于1秒。

Performance Counter的使用相关推荐

  1. Intel® Performance Counter Monitor - A Better Way to Measure CPU Utilization

    https://software.intel.com/content/www/us/en/develop/articles/intel-performance-counter-monitor.html ...

  2. c9, Performance Monitor Control Register

    http://liuluheng.github.io/wiki/public_html/Embedded-System/Cortex-A8/Performance%20Monitor%20Contro ...

  3. SQL Server Performance 分析

    对网络上的一篇博客做下笔记,适当扩展下对 Performance 各个涉及到的要素.这篇文章讲的是分析性能,老外写的: How to analyse SQL Server performance 主要 ...

  4. PAPER NOTES: Roofline: an insightful visual performance model for multicore architectures

    • GATHER: (30MIN)20180327 • PAPER INFO: Roofline: an insightful visual performance model for multico ...

  5. GPU指令集技术分析

    GPU指令集技术分析 本文将两篇文章整理了一下. 参考文章链接如下: https://zhuanlan.zhihu.com/p/391238629 https://zhuanlan.zhihu.com ...

  6. cmodel模拟器开发

    cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...

  7. WAS服务器负载测试软件导读

    转帖:出处未知 你的Web服务器和应用到底能够支持多少并发用户访问?在出现大量并发请求的情况下,软件会出现问题吗?这些问题靠通常的测试手段是无法解答的.本文介绍了Microsoft为这个目的而提供的免 ...

  8. Linux查看进程线程个数

    1.根据进程号进行查询: # pstree -p 进程号 # top -Hp 进程号 2.根据进程名字进行查询: # pstree -p `ps -e | grep server | awk '{pr ...

  9. 内存泄漏排查攻略之:Show me your Memory

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源| cnblogs.com/yougewe/p/11334342.html java 语言有个神奇的地方,那就是你时不时会去 ...

最新文章

  1. 阿里达摩院《机器学习算法学习指南》火了,限时开放下载!
  2. java的异常抛出throws和throw的简单使用
  3. 10大机器学习算法速览,带你开启AI之旅
  4. 鸿蒙开发-从搭建todolist待办事项来学习组件与js之间的交互
  5. ABAP system landscape和vue项目webpack构建的一种实践
  6. 【Python】Python库之机器学习
  7. LeetCode-105:从前序与中序遍历序列构造二叉树
  8. 2021 年 7 月程序员工资统计,最赚钱的岗位出炉。。
  9. 微信小程序tabbar 小程序自定义 tabbar怎么做
  10. 未转变者服务器怎么弄指令权限,» 未转变者 unturned管理员指令
  11. 重拾C语言-摄氏度与华氏度相互转换
  12. 使用Aspose Java在word中绘制插入表格
  13. 独享带宽和共享带宽有哪些区别?
  14. 组播——IGMP Snooping
  15. 在虚拟磁盘中安装Windows Server 2016
  16. 好领导,六字诀“先之、劳之、无倦”,出自《论语》子路问政。子曰:“先之劳之。”请益,曰:“无倦。”
  17. Android MediaCodec 設置 MediaFormat.KEY_PROFILE和MediaFormat.KEY_I_FRAME_INTERVAL之怪异现象
  18. json.converter
  19. 让虚拟机使用usb3.0
  20. 科学绘图origin软件最新版安装,origin软件2023安装教程下载

热门文章

  1. Microsoft Word 设置底纹
  2. mysql 实例名是什么意思_mysql 实例是什么意思?
  3. 了解模型预测控制2--什么是模型预测控制(MPC)
  4. 5G及后5G时代:万物互联到万物智能的黄金时代
  5. 小米typec转miniDP扩展坞评测
  6. C# .Net通过pythonnet调用python pyd文件
  7. ArcEngine 中的-2147467259错误
  8. java中的boolean
  9. android获得手机的时间格式,Android获取手机通讯录并按照时间电话类型分类处理...
  10. 解决桌面图标无法拖动之绝招