Currently showing entries with the tag: performance

page 1 of 1
1 

Simple Speed Testing in .NET - System.Diagnostics.Stopwatch

August 18, 2007 • 6:48AM • permalink
One of the biggest problems with the .NET Framework is that so many new features are released with each major version that minor additions and features usually slip through the cracks. In my experience, very few classes have been overlooked during the transition from 1.1 to 2.0 as much as the Stopwatch class (System.Diagnostics.Stopwatch).

This is a replacement for what most people probably do to test two different blocks of code that perform the same action and compare the speed between them. The process usually goes something like: log the current time, run the test, take the difference between the current time and your logged time, rinse, repeat.

As an alternative, the Stopwatch class was built using low-level API calls, with less overhead than other .NET methods. If the hardware and Windows version of the computer support a high-resolution performance counter, it will use this counter instead of the standard PC clock.

Here is a simple example:


using System.Diagnostics;
//Note: make sure you have this at the top of the class




Stopwatch sw = new Stopwatch();

//do any preliminary processing here, to not inflate your test results

string s1 = "";
string s2 = "";
string letters = "abcdefghijklmnopqrstuvwxyz";
int iterations = 50000;


//TEST 1

sw.Start();

for (int i = 0; i < iterations; ++i)
   s1 += letters[i % 26];

sw.Stop();

//END - TEST 1

Response.Write("Test 1: " + sw.ElapsedMilliseconds + "ms");
//note that you can also use sw.ElapsedTicks



sw.Reset();
//Don't forget to reset the Stopwatch before your second test!!!


//TEST 2

sw.Start();

for (int i = 0; i < iterations; ++i)
   string.Concat(s2, letters[i % 26]);

sw.Stop();

//END - TEST 2

Response.Write(" | Test 2: " + sw.ElapsedMilliseconds + "ms");



As it mentions above, don't forget to Reset your Stopwatch between tests or your subsequent tests will have their times inflated (since otherwise the Stopwatch will continue incrementing from the point that it was stopped).

The Stopwatch has a few other useful methods and properties, such as IsRunning and IsHighResolution. You can view the MSDN description of the Stopwatch class here.


In case you're curious, the string.Concat function outperformed the += operator by over 550 times in repeated tests on my machine. This is due to the fact that the += creates multiple (immutable) string objects, while the string.Concat uses a buffer technique to avoid that. More to come on this topic in a future post.





page 1 of 1
1 




Tags

Introduction programming Python API help performance anime AnimeConPics assembly query Adrianne PC new site Drupal concurrency testing ASP csharp SQL Server 2005 Generic Method AnimeDates network Windows internals PHP open source book review Google AdSense Win32 API RegEx AlternativeNicheNetwork driver module protocol Remote Desktop dotnet bitwise IIS CosplayWar OOP Adam technology syntax SQL anime convention Erlang optimization interface client-side injection script generation