Last time, I talked about the performance counters available in version 1 of the .NET Compact Framework. Today, I'd like to talk about a few of the performance counters available in version 2 of the .NET Compact Framework.

As I mentioned in part 1 (Enabling performance counters), the data collected is written to a file in the device's root folder when the application exits. In version 1 of the .NET Compact Framework, this file was called mscoree.stat. In version 2, the .NET Compact Framework the file's name is derived from your application (ex: WebCrawler.stat).

The following table lists all of the performance counters available in version 2 of the .NET Compact Framework.

Loader

Total Program Run Time (ms)

App Domains Created

App Domains Unloaded

Assemblies Loaded

Classes Loaded

Methods Loaded

Generics

Closed Types Loaded

Closed Types Loaded per Definition

Open Types Loaded

Closed Methods Loaded

Closed Methods Loaded per Definition

Open Methods Loaded

Locks and Threads

Threads in Thread Pool

Pending Timers

Scheduled Timers

Timers Delayed by Thread Pool Limit

Work Items Queued

Uncontested Monitor.Enter Calls

Contested Monitor.Enter Calls

Garbage Collector

Peak Bytes Allocated (native + managed)

Managed Objects Allocated

Managed Bytes Allocated

Managed String Objects Allocated

Bytes of String Objects Allocated

Garbage Collections (GC)

Bytes Collected By GC

Managed Bytes In Use After GC

Total Bytes In Use After GC

GC Compactions

Code Pitchings

Calls to GC.Collect

GC Latency Time (ms)

Pinned Objects

Objects Moved by Compactor

Objects Not Moved by Compactor

Objects Finalized

Boxed Value Types

Process Heap

Short Term Heap

JIT Heap

App Domain Heap

GC Heap

JIT Compiler

Native Bytes Jitted

Methods Jitted

Bytes Pitched

Methods Pitched

Method Pitch Latency Time (ms)

Exceptions

Exceptions Thrown

Interop

Platform Invoke Calls

COM Calls Using a vtable

COM Calls Using IDispatch

Complex Marshaling

Runtime Callable Wrappers

Networking

Socket Bytes Sent

Socket Bytes Received

Windows.Forms

Controls Created

Brushes Created

Pens Created

Bitmaps Created

Regions Created

Fonts Created

Graphics Created (FromImage)

Graphics Created (CreateGraphics)

As you can see in the above table, there are quite a few performance counters available in version 2 of the .NET Compact Framework. Compared to version 1, the counters are more detailed, provide greater insight on the operation of the runtime and allow for a better understanding of application performance issues.

Considering the length of the previous post and the increased number of performance counters available in version 2, I will be discussing the new counters by their categories. With each new installment, I will re-post the above table, along with an example file, and highlight the counters being discussed by setting the background color to yellow.

The statistics file includes running totals, the most recent value (last datum), count (n), average (mean), minimum and maximum values for the counters. I've included an example file at the end of this post. For counters where a given column is not relevant, a hyphen (-) is logged.

I will use the following format to describe each counter.Counter nameBrief description of the counterDiscussion of the contents of relevant columns (total, last datum, n, mean, min, max)Any additional comments relating to the counter

Loader CountersThe first category of counters that I will cover are related to the loader. The loader is the portion of the runtime which is responsible for resolving and loading the components (assemblies, classes, etc) referenced by your application.

Total Program Run Time (ms)The length of time your application ran (from the start of the Common Language Runtime).total: Time in milliseconds

App Domains CreatedThe number of App Domains created in the application's process.total: Running total of created App Domains

App Domains UnloadedThe number of App Domains that were unloaded during the run time of the application.total: Running total of unloaded App Domains

Assemblies LoadedThe number of assemblies loaded (across all App Domains) on behalf of the application.total: Running total of loaded assemblies

Classes LoadedThe number of classes loaded (across all App Domains) during the run time of the application.total: Running total of loaded classes

Methods LoadedThe total number of methods loaded (across all App Domains) during the run time of the application.total: Running total of loaded methods

If you are comparing the version 1 and version 2 counters, you may have noticed that version 2 no longer collects the Execution Engine Startup Time. Since applications cannot impact the Execution Engine's startup time, the counter is not relevant to application writers and was removed from version 2 of the .NET Compact Framework.

Example statistics fileThe following is an example statistics file (formerly known as mscoree.stat) that shows the data collected by running a simple application.

As with the counters table, above, I have highlighted the counters discussed here with a yellow background. As this series continues, I will re-use this same example file and highlight the counters discussed in each post.

counter

total

last datum

n

mean

min

max

Total Program Run Time (ms)

2956837

-

-

-

-

-

App Domains Created

1

-

-

-

-

-

App Domains Unloaded

1

-

-

-

-

-

Assemblies Loaded

8

-

-

-

-

-

Classes Loaded

975

-

-

-

-

-

Methods Loaded

3015

-

-

-

-

-

Closed Types Loaded

75

-

-

-

-

-

Closed Types Loaded per Definition

75

3

22

3

1

10

Open Types Loaded

13

-

-

-

-

-

Closed Methods Loaded

3

-

-

-

-

-

Closed Methods Loaded per Definition

3

1

3

1

1

1

Open Methods Loaded

0

-

-

-

-

-

Threads in Thread Pool

-

0

2

0

0

1

Pending Timers

-

0

4

0

0

1

Scheduled Timers

2

-

-

-

-

-

Timers Delayed by Thread Pool Limit

0

-

-

-

-

-

Work Items Queued

2

-

-

-

-

-

Uncontested Monitor.Enter Calls

664

-

-

-

-

-

Contested Monitor.Enter Calls

0

-

-

-

-

-

Peak Bytes Allocated (native + managed)

2789048

-

-

-

-

-

Managed Objects Allocated

25883

-

-

-

-

-

Managed Bytes Allocated

1366120

24

25883

52

8

135796

Managed String Objects Allocated

5360

-

-

-

-

-

Bytes of String Objects Allocated

124412

-

-

-

-

-

Garbage Collections (GC)

1

-

-

-

-

-

Bytes Collected By GC

897140

897140

1

897140

897140

897140

Managed Bytes In Use After GC

-

147292

1

147292

147292

147292

Total Bytes In Use After GC

-

2621848

1

2621848

2621848

2621848

GC Compactions

0

-

-

-

-

-

Code Pitchings

0

-

-

-

-

-

Calls to GC.Collect

0

-

-

-

-

-

GC Latency Time (ms)

46

46

1

46

46

46

Pinned Objects

0

-

-

-

-

-

Objects Moved by Compactor

0

-

-

-

-

-

Objects Not Moved by Compactor

0

-

-

-

-

-

Objects Finalized

82

-

-

-

-

-

Boxed Value Types

3273

-

-

-

-

-

Process Heap

-

1280

7484

198308

72

330016

Short Term Heap

-

0

6382

963

0

42136

JIT Heap

-

0

6402

421097

0

876976

App Domain Heap

-

0

18679

324926

0

523240

GC Heap

-

0

30

527974

0

1060864

Native Bytes Jitted

844928

208

1963

430

84

9684

Methods Jitted

1963

-

-

-

-

-

Bytes Pitched

0

0

0

0

0

0

Methods Pitched

0

-

-

-

-

-

Method Pitch Latency Time (ms)

0

0

0

0

0

0

Exceptions Thrown

4

-

-

-

-

-

Platform Invoke Calls

0

-

-

-

-

-

COM Calls Using a vtable

0

-

-

-

-

-

COM Calls Using IDispatch

0

-

-

-

-

-

Complex Marshaling

367

-

-

-

-

-

Runtime Callable Wrappers

0

-

-

-

-

-

Socket Bytes Sent

0

-

-

-

-

-

Socket Bytes Received

0

-

-

-

-

-

Controls Created

13

-

-

-

-

-

Brushes Created

23

-

-

-

-

-

Pens Created

8

-

-

-

-

-

Bitmaps Created

16

-

-

-

-

-

Regions Created

0

-

-

-

-

-

Fonts Created

7

-

-

-

-

-

Graphics Created (FromImage)

0

-

-

-

-

-

Graphics Created (CreateGraphics)

0

-

-

-

-

-

Take care,-- DK

[Edit: update counter table to fix errors][Edit: post title]

Disclaimer(s):This posting is provided "AS IS" with no warranties, and confers no rights.