views:

606

answers:

5

I need to do some performance benchmarks on .NET programs (C#) in Windows, but I haven't done benchmarking much in the Windows world. I've looked into using the Windows 2000/XP Performance monitor with custom counters for this, but I don't think this is quite what I want.

Are there any good system facilities for this in Windows XP, or do I need to just use System.Diagnostics.Stopwatch [edit] and write text logs for manual interpretation, or is there something else?

Edit: is there anything beyond System.Diagnostics.Stopwatch?

+2  A: 
using System.Diagnostics;
....

Stopwatch sw = new Stopwatch();

sw.Start();

// Stuff you want to time...

sw.Stop();

Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks");
Mitch Wheat
+3  A: 

This may not be what you want, but dotTrace offers many useful diagnostics and is integrated into Visual Studio.

+2  A: 

There are quite a few profilers out there. Here are some of the ones I know of:

Red Gate's ANTS (http://www.red-gate.com/products/ants_profiler/index.htm)
Yourkit's .Net Profiler (http://www.yourkit.com/dotnet/download/index.jsp)
JetBrains dotTrace 9http://www.jetbrains.net/confluence/display/NetProf/Home)

If you go on with using System.Diagnostics.Stopwatch, you will be able to instrument and measure only particular points of your code, where you explicitly put the Start/Stop around. This is good enough for measuring specific pieces, like a tight loop or things like that, but it's not going to give you a complete picture of where your program spends most of its time.

Franci Penov
+2  A: 

For micro-benchmarking I really like MeasureIt (can be downloaded from http://msdn.microsoft.com/en-us/magazine/cc500596.aspx). It is a test project written by Vance Morrison a Performance Architect on the CLR. It currently has a good set of benchmarks for a number of .Net/CLR core methods. The best part of it is that it is trivial to tweak and add new benchmarks for whatever you would like to test. Simply run "MeasureIt /edit" and it will launch VS with the project for itself so that you can view how those benchmarks are written and add new ones in a similar fashion if you like.

As already been stated StopWatch is probably the easiest way to do this and MeasureIt uses StopWatch underneath for its timings but it also does some other things like running a block of code X times and then providing you stats for the runs and what not.

Wes Haggard
+2  A: 

If you want just some quick numbers, you can use Powershell to time overall execution. Use the measure-command cmdlet. It's roughly equivalent to "time" in Unix.

> measure-command { your.exe arg1 }

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 4
Milliseconds      : 996
Ticks             : 49963029
TotalDays         : 5.78275798611111E-05
TotalHours        : 0.00138786191666667
TotalMinutes      : 0.083271715
TotalSeconds      : 4.9963029
TotalMilliseconds : 4996.3029
fatcat1111