.NET Compact Framework 中的性能计数器
更新:2007 年 11 月
.NET Compact Framework 不支持 PerformanceCounter 对象,因为它们与 Windows CE 和 .NET Compact Framework 无关。不过,.NET Compact Framework 包含一组预定义的性能计数器,可用来分析应用程序在 .NET Compact Framework 上的负载类型。这些计数器是不可扩展的。
您可以在设备上生成一个包含有关应用程序的性能统计信息的文件。有关分步过程,请参见如何:生成性能统计信息。
性能计数器有助于理解垃圾回收和实时编译对应用程序性能的影响。您可以从这些统计信息中判断出应该进行哪些优化。
统计信息文件列出的性能计数器具有以下列。
列 |
说明 |
---|---|
Total |
出现的总次数。 |
Last Datum |
最后一条信息。 |
N |
出现次数。 |
Mean |
与其他值平均后的值。 |
Min |
最小值。 |
Max |
最大值。 |
.NET Compact Framework 计数器
性能计数器按以下类别进行组织:
加载程序 |
JIT Compilation — JIT 编译 |
泛型 |
异常 |
锁和线程 |
互操作 |
垃圾回收 |
网络 |
内存 |
Windows 窗体 |
加载程序计数器
下列计数器属于公共语言运行库 (CLR) 的一个部分,该部分负责解决和加载应用程序引用的组件(例如程序集和类)。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
程序运行总时间(毫秒) RunTime |
从 CLR 调用开始所经过的时间(以毫秒为单位)。 |
Calculated |
创建的应用程序域 napplication 域 |
在应用程序的进程中创建的应用程序域的数量。 |
Simple |
卸载的应用程序域 napplication domainsUnloaded |
在应用程序运行时期间已卸载的应用程序域的数量。 |
Simple |
加载的程序集 nAssembliesloaded |
已跨所有应用程序域为应用程序加载的程序集的数量。 |
Simple |
加载的类 nClassesloaded |
在应用程序运行时期间已跨所有应用程序域加载的类的数量。 |
Simple |
已加载的方法 nMethodsloaded |
在应用程序运行时期间已跨所有应用程序域加载的方法的总计数。 |
Simple |
泛型计数器
泛型计数器是特定于精简版的泛型功能的加载程序计数器。CLR 在内部使用泛型。因此,即使应用程序未显式使用泛型,您也可能会在这些计数器中看到一些值。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
已加载的封闭式类型 nInstGenericTypesLoaded |
已跨所有应用程序域加载的独特的泛型类型的计数。 封闭式类型是指已与特定的数据类型绑定的泛型类。例如,MyGenericType<Int32> 实例是一个封闭式类型。 |
Simple |
每个定义加载的封闭式类型 nMaxClosedTypes |
可跨所有应用程序域为给定的定义创建的独特的泛型类型的最大数量。 例如,如果应用程序实例化 MyGenericType<Int32>、MyGenericType<String> 和 MyGenericType<Single>,则为 MyGenericType<T> 定义加载的封闭式类型的数量为三 (3)。 Max 列中的大数目(几百或更多)可以根据 JIT 编译的代码和 CLR 数据结构指示工作集压力。 |
StaticOnly |
已加载的开放式类型 nOpenTypesLoaded |
跨所有应用程序域创建的开放式泛型类型的计数。 开放式类型是指已加载但未与特定的数据类型绑定的泛型类。开放式类型通常仅在反射方案中创建。 例如,使用反射加载 MyGenericType<T> 的实例将使“已加载的开放式类型”计数器递增。当绑定该类型时(例如在 MyGenericType<String> 中),它将变为封闭式类型并将使“已加载的开放式类型”计数器递增。.NET Compact Framework CLR 将在内部使用反射,并且可以是开放式类型的源。例如,XML 序列化和 Web 服务都将在内部使用反射。 |
Simple |
已加载的封闭式方法 nInstGenericMethodsLoaded |
已跨所有应用程序域加载的独特的泛型方法的计数。 封闭式方法是指已与特定的数据类型绑定的泛型方法。包含此方法的类型可能是泛型类型,也可能不是。例如,MyType.ProcessData<Int32>() 的实例是一个封闭式方法。 |
Simple |
每个定义加载的封闭式方法 nMaxClosedMethods |
可跨所有应用程序域为给定的定义创建的独特的泛型方法的最大数量。 此计数器与“每个定义加载的封闭式类型”计数器非常类似。使用下列 MyType.ProcessData<Int32>()、MyType.ProcessData<String>() 和 MyType.ProcessData<Single>() 的实例将为 MyType.ProcessData<T>() 定义创建三种封闭式方法。 与“每个定义加载的封闭式类型”计数器一样,“Max”列中的大数目(几百或更多)可以根据 JIT 编译的代码和 CLR 数据结构指示工作集压力。 |
StaticOnly |
已加载的开放式方法 nOpenMethodsLoaded |
跨所有应用程序域创建的开放式泛型方法的计数。开放式方法通常仅在反射方案中创建。开放式方法是指已加载但未绑定到特定类型的泛型方法。 .NET Compact Framework 运行库在内部使用反射,并且可以是开放式方法的源。 |
Simple |
锁和线程计数器
下列计数器与线程处理、锁、计时器和线程池有关。这些计数器通过提供有关应用程序运行时期间的线程、计时器和锁使用情况的数据,帮助标识与线程处理相关的性能问题。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
线程池中的线程 nThreads |
线程池中的当前线程数量。 此计数器将对使用 QueueUserWorkItem 方法启动的线程计数。此计数器不包括通过使用 Start 方法启动的线程。 |
MinMax |
挂起的计时器 nPendingTimers |
当前排队的计时器的数量。 |
MinMax |
预定计时器 nTimersStarted |
当前正在运行或计划要运行的计时器的数量。 |
Simple |
被线程池限制延迟的计时器 nTimersDelayed |
已被线程池限制延迟的计时器的计数。 |
Simple |
排队的工作项 nWorkItemsQueued |
已排入线程池队列的工作项的计数。 |
Simple |
未争用的 Monitor.Enter 调用 nUncontestedMonitor |
已对 Enter 方法进行的未发生争用的调用的计数。 |
Simple |
争用的 Monitor.Enter 调用 nContestedMonitor |
已对 Enter 进行的发生争用的调用的计数。 在多线程应用程序中,如果 Thread1 持有一把锁,而 Thread2 需要访问由该锁保护的代码,则 Contested Monitor.Enter Calls(争用的 Monitor.Enter 调用)计数器将递增。 |
Simple |
垃圾回收计数器
下列计数器与垃圾回收操作有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
分配的峰值字节(本机 + 托管) cbPeakMemUsage |
由 CLR 使用的最大字节数量(包括本机内存和托管内存)。 |
Calculated |
分配的托管对象 nObjectsAllocated |
由垃圾回收器分配的对象的计数。 |
Simple |
已分配的未使用托管对象 nObjectsAllocatedNotUsed |
已分配的从未使用的对象的计数。 |
Simple |
已分配的托管字节 cbAllocated |
由垃圾回收器分配的字节的计数。 |
Complex |
已分配的未使用托管字节 cbAllocatedNotUsed |
已分配的从未使用的字节的计数。 |
Complex |
已分配的托管字符串对象 nStrings |
由垃圾回收器分配的托管字符串对象的数量。 |
Simple |
已分配的字符串对象的字节数 nStringBytes |
由垃圾回收器分配的字符串对象的字节计数。 |
Simple |
垃圾回收 (GC) nGC |
垃圾回收器已运行的次数。 |
Simple |
GC 回收的字节数 cbGarbage |
由垃圾回收器回收的字节的计数。 |
Complex |
垃圾回收后仍使用的托管字节数 cbLive |
上次垃圾回收之后分配给活动对象的字节数。 |
MinMax |
垃圾回收后仍使用的字节总数 cbWorkingSetMem |
上次垃圾回收后仍使用的本机和托管内存的字节数量。 |
MinMax |
GC 压缩 nCompactions |
垃圾回收器已压缩堆的次数。 |
Simple |
代码丢弃 nPitches |
垃圾回收器已丢弃 JIT 编译的代码的次数。 |
Simple |
对 GC.Collect 的调用 nInduced |
应用程序已调用 Collect 方法的次数。 |
Simple |
GC 滞后时间(毫秒) msLatency |
垃圾回收器回收对象和压缩堆所花的总时间(以毫秒为单位)。 垃圾回收器的滞后时间包括回收不再位于范围之内的托管对象的时间和压缩垃圾回收器堆所花的时间(若需要)。 |
Complex |
固定对象 nPinned |
执行垃圾回收时遇到的固定对象的计数。 固定对象是指其内存中的位置不能更改的对象。例如,用于在托管代码和非托管代码之间通信的内存缓冲区是一个固定对象。在压缩堆期间,垃圾回收器无法移动固定对象。 |
Simple |
压缩器移动的对象 nObjMoved |
由垃圾回收器在压缩期间移动的对象的计数。 |
Simple |
压缩器未移动的对象 nObjNotMoved |
在压缩期间未由垃圾回收器移动的对象的计数。 对象可能会由于各种原因而无法移动。一些对象本身无法移动,但这些对象很少。其他对象则是因为位于堆中不需要压缩的某个部分而不会移动。 |
Simple |
完成的对象 nFinalizersRun |
已为其运行终结器的对象的计数。 |
Simple |
已装箱的值类型 nBoxes |
已装箱的值类型的数量。 |
Simple |
内存计数器
下列计数器与由垃圾回收器托管的内存堆有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
进程堆 HeapDefault |
当前由 CLR 的默认堆使用的字节数。 “进程堆”包含由不适合此表中列出的其他堆的 CLR 分配的内存。 |
MinMax |
短期堆 HeapShortTerm |
当前由 CLR 的短期堆使用的字节数。 “短期堆”包含由 CLR 分配的供临时使用的内存。 |
MinMax |
JIT 堆 HeapJitCodeBuffer |
由 JIT 编译器的堆使用的字节数。 “JIT 堆”包含 .NET Compact Framework JIT 编译器编译托管方法时所生成的本机代码。只要是第一次执行某个托管方法或在丢弃代码后第一次执行某个方法,就会发生 JIT 编译。 |
MinMax |
应用程序域堆 HeapAppDomain |
由 CLR 的应用程序域堆使用的字节数。 “应用程序域堆”包含 CLR 的程序集加载程序使用的元数据的动态表现形式。 |
MinMax |
GC 堆 HeapGC |
由垃圾回收器堆使用的字节数。 “GC 堆”包含由应用程序和 .NET Compact Framework 分配的内存。 |
MinMax |
JIT 编译计数器
下列计数器与 JIT 编译器操作有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
实时编译的本机字节 cbJittedNative |
由 JIT 编译器生成的本机代码的字节计数。 |
Complex |
实时编译的方法 nMethodsJitted |
由 JIT 编译器生成的方法的计数。 |
Simple |
丢弃的字节 cbPitched |
由 JIT 编译器生成的已丢弃的本机代码的字节计数。 |
Complex |
丢弃的方法 nMethodsPitched |
由 JIT 编译器生成的已丢弃的方法的计数。 除非在应用程序运行时期间将其移动到后台,否则“丢弃的方法”计数器的任何正值将指示该应用程序在内存压力下运行。 |
Simple |
方法丢弃滞后时间(毫秒) msPitchLatency |
丢弃由 JIT 编译器生成的方法所花的总时间(以毫秒为单位)。 |
Complex |
异常计数器
下列计数器与异常有关。
名称和简称 |
说明 |
---|---|
已引发的异常 nExceptions |
已引发的托管异常的计数。 由于引发异常会消耗大量资源,因此,跟踪应用程序引发的异常数可以帮助您发现潜在的设计问题。 |
Interop 计数器
下列计数器和与本机代码的互操作性有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
平台 Invoke 调用 nPInvoke |
从托管代码对本机代码发出的“平台调用”调用的计数,内部 CLR“平台调用”调用排除在外。 |
Simple |
使用 vtable 的 COM 调用 nComVTable |
使用 COM 互操作 vtable 方法从托管代码对本机代码发出的调用的计数。 |
Simple |
使用 IDispatch 的 COM 调用 nComIDispatch |
使用 COM 互操作 IDispatch 方法从托管代码对本机代码发出的调用的计数。 |
Simple |
复杂封送处理 nMarshal |
从托管代码封送处理为本机代码的涉及复制或转换数据的对象的数量。 |
Simple |
运行库可调用包装 cTotalRcw |
已创建的 COM 运行库可调用包装的总计数。 当在 .NET Compact Framework 运行库上运行的托管代码对非托管 COM 对象进行调用时,将创建运行库可调用包装。 |
Simple |
联网计数器
下列计数器与网络发送和接收操作有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
发送的套接字字节 nBytesSent |
通过套接字发送的字节的总计数。 |
Simple |
接收的套接字字节 nBytesReceived |
通过套接字接收的字节的总计数。 |
Simple |
Windows 窗体计数器
下列计数器与 System.Windows.Forms 命名空间有关。
名称和简称 |
说明 |
计数器类型 |
---|---|---|
已创建的控件 nControlsCreated |
由应用程序创建的控件的总数。 |
Simple |
已创建的画笔 nBrushesCreated |
由应用程序创建的画笔对象的总数。 |
Simple |
已创建的钢笔 nPensCreated |
由应用程序创建的钢笔对象的总数。 |
Simple |
已创建的位图 nBitmapsCreated |
由应用程序创建的位图对象的总数。 |
Simple |
已创建的区域 nRegionsCreated |
由应用程序创建的区域对象的总数。 |
Simple |
已创建的字体 nFontsCreated |
由应用程序创建的字体对象的总数。 |
Simple |
已创建的图形 (FromImage) nGraphicsFromImage |
由 FromImage 方法创建的图形对象的总数。 |
Simple |
已创建的图形 (CreateGraphics) nGraphicsCreateGraphics |
由 CreateGraphics 方法创建图形对象的总数。 |
Simple |