You’ve just finished writing the worlds most amazing .NET Compact Framework application running on Windows Embedded CE 6.0, the application does everything apart from making a nice cup of hot tea. But how well does the application perform? Writing .NET code is great, the class libraries make you super productive, and unlike C++ development you don’t need to worry about pointers or the lifetime of the objects you create, the Garbage Collector sweeps up behind you, right? Sure, absolutely, but that doesn’t mean that you should be a lazy programmer, writing in high level languages doesn’t mean that you shouldn’t care about the performance of your application. Do you know how many objects are created/disposed during the runtime of your application, or how many methods are Jitted, or Code Pitched? – why not? – probably because you’ve not seen how to capture this useful information.

The process for capturing useful application statistics is extremely simple – you just need to set one registry key on your device – in this case I’ve added the registry key to my CE 6.0 operating system image, and have written a very simple .NET Compact Framework 3.5, C#, WinForms based application that has two buttons, 1) Allocate 10k objects, and 2) Exit – the application is called SimpleCFApp (obviously!).

Here’s the registry key:

[HKEY_LOCAL_MACHINE\Software\Microsoft\.NETCompactFramework\PerfMonitor]
  "Counters"=dword:1

The output from the application is stored in the root of your devices file system and is named “YourApplicationName”.stat – so for my application I get a file called \SimpleCFApp.stat

Here’s the output from my simple application…

Counter                                           total   last datum            n       mean        min        max
Total Program Run Time (ms)                       34044            -            -          -          -          -
App Domains Created                                   1            -            -          -          -          -
App Domains Unloaded                                  1            -            -          -          -          -
Assemblies Loaded                                     5            -            -          -          -          -
Classes Loaded                                      291            -            -          -          -          -
Methods Loaded                                      425            -            -          -          -          -
Closed Types Loaded                                   0            -            -          -          -          -
Closed Types Loaded per Definition                    0            0            0          0          0          0
Open Types Loaded                                     1            -            -          -          -          -
Closed Methods Loaded                                 0            -            -          -          -          -
Closed Methods Loaded per Definition                  0            0            0          0          0          0
Open Methods Loaded                                   0            -            -          -          -          -
Threads in Thread Pool                                -            0            0          0          0          0
Pending Timers                                        -            0            0          0          0          0
Scheduled Timers                                      0            -            -          -          -          -
Timers Delayed by Thread Pool Limit                   0            -            -          -          -          -
Work Items Queued                                     0            -            -          -          -          -
Uncontested Monitor.Enter Calls                      10            -            -          -          -          -
Contested Monitor.Enter Calls                         0            -            -          -          -          -
Peak Bytes Allocated (native + managed)          281094            -            -          -          -          -
Managed Objects Allocated                           184            -            -          -          -          -
Managed Bytes Allocated                            6152           32          184         33          8        576
Managed String Objects Allocated                     29            -            -          -          -          -
Bytes of String Objects Allocated                   492            -            -          -          -          -
Garbage Collections (GC)                              0            -            -          -          -          -
Bytes Collected By GC                                 0            0            0          0          0          0
Managed Bytes In Use After GC                         -            0            0          0          0          0
Total Bytes In Use After GC                           -            0            0          0          0          0
GC Compactions                                        0            -            -          -          -          -
Code Pitchings                                        0            -            -          -          -          -
Calls to GC.Collect                                   0            -            -          -          -          -
GC Latency Time (ms)                                  0            0            0          0          0          0
Pinned Objects                                        0            -            -          -          -          -
Objects Moved by Compactor                            0            -            -          -          -          -
Objects Not Moved by Compactor                        0            -            -          -          -          -
Objects Finalized                                     4            -            -          -          -          -
Objects on Finalizer Queue                            -            0           21         10          0         20
Boxed Value Types                                     0            -            -          -          -          -
Process Heap                                          -          422          707      10924        312      20778
Short Term Heap                                       -            0          128        801          0      30752
JIT Heap                                              -            0          828      35910          0      71725
App Domain Heap                                       -         1536          238      87004       1536     125625
GC Heap                                               -            0            2      32768          0      65536
Native Bytes Jitted                               64504          216          224        287         84       3568
Methods Jitted                                      224            -            -          -          -          -
Bytes Pitched                                         0            0            0          0          0          0
Methods Pitched                                       0            -            -          -          -          -
Method Pitch Latency Time (ms)                        0            0            0          0          0          0
Exceptions Thrown                                     0            -            -          -          -          -
Platform Invoke Calls                                 0            -            -          -          -          -
COM Calls Using a vtable                              0            -            -          -          -          -
COM Calls Using IDispatch                             0            -            -          -          -          -
Complex Marshaling                                    0            -            -          -          -          -
Runtime Callable Wrappers                             0            -            -          -          -          -
Socket Bytes Sent                                     0            -            -          -          -          -
Socket Bytes Received                                 0            -            -          -          -          -
Controls Created                                      4            -            -          -          -          -
Brushes Created                                       1            -            -          -          -          -
Pens Created                                          0            -            -          -          -          -
Bitmaps Created                                       0            -            -          -          -          -
Regions Created                                       0            -            -          -          -          -
Fonts Created                                         2            -            -          -          -          -
Graphics Created (FromImage)                          0            -            -          -          -          -
Graphics Created (CreateGraphics)                     0            -            -          -          -          -

Obviously this is a really simple application, application statistics may be more interesting for a slightly more complex application.

- Mike