Performance Counters in the .NET Compact Framework

[This documentation is for preview only, and is subject to change in later releases. Blank topics are included as placeholders.]

The .NET Compact Framework does not support PerformanceCounter objects because they do not pertain to Windows CE and the .NET Compact Framework. However, the .NET Compact Framework contains a set of predefined performance counters for analyzing the types of load your application has on the .NET Compact Framework. The counters are not extensible.

You can generate a file on your device that contains performance statistics about your application. For a step-by-step procedure, see How to: Generate Performance Statistics.

The performance counters are useful for understanding the impact of garbage collection and just-in-time compilation on application performance. From these statistics you can determine where optimizations should occur.

The statistics file lists the performance counters with the following columns.

Column

Description

Total

Summation of occurrences.

Last Datum

The last piece of information.

N

The number of occurrences.

Mean

The intermediate between other values.

Min

The minimum value.

Max

The maximum value.

.NET Compact Framework Counters

The performance counters are organized in the following categories:

Loader

JIT compilation

Generics

Exceptions

Locks and threads

Interop

Garbage collection

Networking

Memory

Windows Forms

Loader Counters

The following counters pertain to the portion of the common language runtime (CLR) that is responsible for resolving and loading components that are referenced by your application, such as assemblies and classes.

Name and short name

Description

Counter type

Total Program Run Time (ms)

RunTime

The elapsed time, in milliseconds, from CLR invocation.

Calculated

App Domains Created

napplication domains

The number of application domains created in the application's process.

Simple

App Domains Unloaded

napplication domainsUnloaded

The number of application domains that have been unloaded during the run time of the application.

Simple

Assemblies Loaded

nAssembliesloaded

The number of assemblies that have been loaded across all application domains for the application.

Simple

Classes Loaded

nClassesloaded

The number of classes that have been loaded across all application domains during the run time of the application.

Simple

Methods Loaded

nMethodsloaded

The total count of methods loaded across all application domains during the run time of the application.

Simple

Generics Counters

The generics counters are loader counters that are specific to the generics feature of the compact. The CLR uses generics internally. Consequently, you might see values in these counters even if your application does not use generics explicitly.

Name and short name

Description

Counter type

Closed Types Loaded

nInstGenericTypesLoaded

The count of unique generic types that have been loaded across all application domains.

A closed type is a generic class that has been bound with a specific data type. For example, an instance of MyGenericType<Int32> is a closed type.

Simple

Closed Types Loaded per Definition

nMaxClosedTypes

The maximum number of unique generic types created for a given definition across all application domains.

For example, if an application instantiates MyGenericType<Int32>, MyGenericType<String>, and MyGenericType<Single>, the number of closed types loaded for the MyGenericType<T> definition is three (3).

A large number (several hundred or more) in the Max column can indicate working-set pressure in terms of JIT-compiled code and CLR data structures.

StaticOnly

Open Types Loaded

nOpenTypesLoaded

The count of open generic types created across all application domains.

An open type is a generic class that has been loaded, but has not been bound with a specific data type. Open types are typically created only in reflection scenarios.

For example, loading an instance of MyGenericType<T> by using reflection will increment the Open Types Loaded counter. When the type has been bound, such as in MyGenericType<String>, it becomes a closed type and the Closed Types Loaded counter is incremented. The .NET Compact Framework CLR uses reflection internally and can be the source of the open types. For example, XML serialization and Web services use reflection internally.

Simple

Closed Methods Loaded

nInstGenericMethodsLoaded

The count of unique generic methods that have been loaded across all application domains.

A closed method is a generic method that has been bound with a specific data type. The type that contains the method may or may not be a generic type. For example, an instance of MyType.ProcessData<Int32>() is a closed method.

Simple

Closed Methods Loaded per Definition

nMaxClosedMethods

The maximum number of unique generic methods created for a given definition across all application domains.

This counter is very similar to the Closed Types Loaded per Definition counter. Using the following instances of MyType.ProcessData<Int32>(), MyType.ProcessData<String>(), and MyType.ProcessData<Single>() will create three closed methods for the MyType.ProcessData<T>() definition.

As with the Closed Types Loaded per Definition counter, a large number (several hundred or more) in the Max column can indicate working-set pressure in terms of JIT-compiled code and CLR data structures.

StaticOnly

Open Methods Loaded

nOpenMethodsLoaded

The count of open generic methods created across all application domains. Open methods are typically created only in reflection scenarios. An open method is a generic method that has been loaded, but not bound to a specific type.

The .NET Compact Framework runtime uses reflection internally and can be the source of the open methods.

Simple

Locks and Threads Counters

The following counters pertain to threading, locks, timers, and thread pools. These counters can help identify threading-related performance issues by providing data on thread, timer, and lock usage during the run time of your application.

Name and short name

Description

Counter type

Threads in Thread Pool

nThreads

The number of threads currently in the thread pool.

This counter counts the threads that are started by using the QueueUserWorkItem method. This counter does not include threads that are started by using the Start method.

MinMax

Pending Timers

nPendingTimers

The number of timers currently queued.

MinMax

Scheduled Timers

nTimersStarted

The number of timers that are currently running or scheduled to run.

Simple

Timers Delayed by Thread Pool Limit

nTimersDelayed

The count of timers that have been delayed by the thread pool limit.

Simple

Work Items Queued

nWorkItemsQueued

The count of work items queued to the thread pool.

Simple

Uncontested Monitor.Enter Calls

nUncontestedMonitor

Count of calls made to the Enter method that were not contested.

Simple

Contested Monitor.Enter Calls

nContestedMonitor

Count of calls made to Enter that were contested.

In multithreaded applications, if Thread1 is holding a lock and Thread2 needs to access code that is guarded by the lock, the Contested Monitor.Enter Calls counter is incremented.

Simple

Garbage Collection Counters

The following counters pertain to garbage collection operations.

Name and short name

Description

Counter type

Peak Bytes Allocated (native + managed)

cbPeakMemUsage

The maximum number of bytes in use by the CLR, including both native and managed memory.

Calculated

Managed Objects Allocated

nObjectsAllocated

The count of objects allocated by the garbage collector.

Simple

Unused Managed Objects Allocated

nObjectsAllocatedNotUsed

The count of objects allocated that were never used.

Simple

Managed Bytes Allocated

cbAllocated

The count of bytes allocated by the garbage collector.

Complex

Unused Managed Bytes Allocated

cbAllocatedNotUsed

The count of bytes allocated that were never used.

Complex

Managed String Objects Allocated

nStrings

The number of managed string objects allocated by the garbage collector.

Simple

Bytes of String Objects Allocated

nStringBytes

The count of bytes of string objects allocated by the garbage collector.

Simple

Garbage Collections (GC)

nGC

The number of times the garbage collector has run.

Simple

Bytes Collected by GC

cbGarbage

The count of bytes collected by the garbage collector.

Complex

Managed Bytes in Use After GC

cbLive

The number of bytes allocated to live objects after the last garbage collection.

MinMax

Total Bytes in Use After GC

cbWorkingSetMem

The number of bytes of memory, native and managed, in use after the last garbage collection.

MinMax

GC Compactions

nCompactions

The number of times the garbage collector has compacted the heap.

Simple

Code Pitchings

nPitches

The number of times the garbage collector has discarded JIT-compiled code.

Simple

Calls to GC.Collect

nInduced

The number of times the application has called the Collect method.

Simple

GC Latency Time (ms)

msLatency

The total time, in milliseconds, that the garbage collector has taken to collect objects and compact the heap.

The latency time of the garbage collector includes the time to collect managed objects that are no longer in scope and the compaction time, if necessary, of the garbage collector heap.

Complex

Pinned Objects

nPinned

The count of pinned objects encountered while performing a garbage collection.

Pinned objects are objects whose locations in memory cannot change. For example, a memory buffer that is being used to communicate between managed and unmanaged code is a pinned object. Pinned objects cannot be moved by the garbage collector during heap compaction.

Simple

Objects Moved by Compactor

nObjMoved

The count of objects moved by the garbage collector during a compaction.

Simple

Objects Not Moved by Compactor

nObjNotMoved

The count of the objects that were not moved by the garbage collector during a compaction.

Objects might not be moved for a number of reasons. Some objects cannot be moved, but these objects are rare. Other objects are not moved because they are in a portion of the heap that does not need to be compacted.

Simple

Objects Finalized

nFinalizersRun

The count of objects for which a finalizer has been run.

Simple

Boxed Value Types

nBoxes

The number of value types that have been boxed.

Simple

Memory Counters

The following counters pertain to the memory heaps managed by the garbage collector.

Name and short name

Description

Counter type

Process Heap

HeapDefault

The number of bytes currently in use by the CLR's default heap.

The Process Heap contains memory allocated by the CLR that does not fit into the other heaps listed in this table.

MinMax

Short Term Heap

HeapShortTerm

The number of bytes currently in use by the CLR's short-term heap.

The Short Term Heap contains memory allocated by the CLR for temporary use.

MinMax

JIT Heap

HeapJitCodeBuffer

The number of bytes in use by the JIT compiler's heap.

The JIT Heap contains the native code generated when the .NET Compact Framework JIT compiler compiles a managed method. JIT compilation occurs whenever a managed method is executed for the first time, or the first time a method is executed after code is discarded.

MinMax

App Domain Heap

HeapAppDomain

The number of bytes in use by the CLR's application domain heap.

The App Domain Heap contains the dynamic representation of metadata used by the CLR's assembly loader.

MinMax

GC Heap

HeapGC

The number of bytes in use by the garbage collector heap.

The GC Heap contains memory allocated by applications and the .NET Compact Framework.

MinMax

JIT Compilation Counters

The following counters pertain to JIT compiler operations.

Name and short name

Description

Counter type

Native Bytes Jitted

cbJittedNative

The count of bytes of native code generated by the JIT compiler.

Complex

Methods Jitted

nMethodsJitted

The count of methods generated by the JIT compiler.

Simple

Bytes Pitched

cbPitched

The count of bytes of native code generated by the JIT compiler that have been discarded.

Complex

Methods Pitched

nMethodsPitched

The count of methods generated by the JIT compiler that have been discarded.

Unless your application was moved to the background during its run time, any positive value for the Methods Pitched counter indicates that the application ran under memory pressure.

Simple

Method Pitch Latency Time (ms)

msPitchLatency

The total time, in milliseconds, spent discarding methods generated by the JIT compiler.

Complex

Exceptions Counters

The following counters pertain to exceptions.

Name and short name

Description

Exceptions Thrown

nExceptions

The count of managed exceptions that have been thrown.

Because throwing an exception consumes significant resources, tracking the number of exceptions thrown by your application can help identify potential design issues.

Interop Counters

The following counters pertain to interoperability with native code.

Name and short name

Description

Counter type

Platform Invoke Calls

nPInvoke

The count of platform invoke calls from managed code to native code, excluding internal CLR platform invoke calls.

Simple

COM Calls Using a vtable

nComVTable

The count of calls from managed code to native code using the COM interop vtable method.

Simple

COM Calls Using IDispatch

nComIDispatch

The count of calls from managed code to native code using the COM interop IDispatch method.

Simple

Complex Marshaling

nMarshal

The number of objects marshaled from managed code to native code that involved copying or transforming the data.

Simple

Runtime Callable Wrappers

cTotalRcw

The total count of COM runtime callable wrappers that have been created.

Runtime callable wrappers are created when managed code running on the .NET Compact Framework runtime calls into an unmanaged COM object.

Simple

Networking Counters

The following counters pertain to network send and receive operations.

Name and short name

Description

Counter type

Socket Bytes Sent

nBytesSent

The total count of bytes sent over sockets.

Simple

Socket Bytes Received

nBytesReceived

The total count of bytes received over sockets.

Simple

Windows Forms Counters

The following counters pertain to the System.Windows.Forms namespace.

Name and short name

Description

Counter type

Controls Created

nControlsCreated

The total number of controls created by the application.

Simple

Brushes Created

nBrushesCreated

The total number of brush objects created by the application.

Simple

Pens Created

nPensCreated

The total number of pen objects created by the application.

Simple

Bitmaps Created

nBitmapsCreated

The total number of bitmap objects created by the application.

Simple

Regions Created

nRegionsCreated

The total number of region objects created by the application.

Simple

Fonts Created

nFontsCreated

The total number of font objects created by the application.

Simple

Graphics Created (FromImage)

nGraphicsFromImage

The total number of graphics objects created by the FromImage method.

Simple

Graphics Created (CreateGraphics)

nGraphicsCreateGraphics

The total number of graphics objects created by the CreateGraphics method.

Simple

See Also

Tasks

How to: Generate Performance Statistics

Other Resources

Performance and Diagnostics in the .NET Compact Framework