<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.claritycon.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Mike Harkabus</title><subtitle type="html" /><id>http://blogs.claritycon.com/blogs/mike_harkabus/atom.aspx</id><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/mike_harkabus/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.claritycon.com/blogs/mike_harkabus/atom.aspx" /><generator uri="http://communityserver.org" version="3.1.20917.1142">Community Server</generator><updated>2006-05-06T18:32:00Z</updated><entry><title>iAccelerate</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/mike_harkabus/archive/2007/02/19/2798.aspx" /><id>http://blogs.claritycon.com/blogs/mike_harkabus/archive/2007/02/19/2798.aspx</id><published>2007-02-20T00:58:00Z</published><updated>2007-02-20T00:58:00Z</updated><content type="html">&lt;P&gt;&lt;SPAN class=entry_description&gt;I recently had an article published that shows how to build a Windows Forms application using an accelerometer to measure the performance of a vehicle.&amp;nbsp; By using basic physics equations, a vehicle’s current speed, distance traveled, horsepower, and other performance metrics can be derived from the acceleration values provided by the accelerometer. It's pretty cool, check it out.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;A href="http://blogs.msdn.com/coding4fun/archive/2007/02/18/1709215.aspx"&gt;http://blogs.msdn.com/coding4fun/archive/2007/02/18/1709215.aspx&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;A href="http://channel9.msdn.com/ShowPost.aspx?PostID=283953"&gt;http://channel9.msdn.com/ShowPost.aspx?PostID=283953&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=entry_description&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=2798" width="1" height="1"&gt;</content><author><name>mharkabus</name><uri>http://blogs.claritycon.com/members/mharkabus.aspx</uri></author></entry><entry><title>High-resolution timer using .NET</title><link rel="alternate" type="text/html" href="http://blogs.claritycon.com/blogs/mike_harkabus/archive/2006/05/06/526.aspx" /><id>http://blogs.claritycon.com/blogs/mike_harkabus/archive/2006/05/06/526.aspx</id><published>2006-05-06T23:32:00Z</published><updated>2006-05-06T23:32:00Z</updated><content type="html">&lt;P&gt;I was recently at work, and was doing some performance testing on a web service that we created. The web service request&amp;nbsp;message basically consisted of an array of&amp;nbsp;inventory items (mostly books in our case) and the response message&amp;nbsp;returned gave the status of all the items passed to it&amp;nbsp;(such as quantity available, quantity on order, etc.). Anywho, &amp;nbsp;I was getting some really odd times, and I couldn't let it go. Let me explain...&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;This is how I was doing my timing:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Dim startTime As DateTime = DateTime.MinValue&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Dim endTime As DateTime = DateTime.MinValue&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Dim elapsedTime As TimeSpan&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;startTime = DateTime.Now()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;'call the web service&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;inventoryAvailability = invTestObj.RequestInventoryStatus(inventoryItems)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;endTime = DateTime.Now()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;'get the difference&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;elapsedTime = endTime.Subtract(startTime)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;'this outputs the elapsed time in milliseconds to the console in a nice format&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Console.WriteLine(elapsedTime.TotalMilliseconds.ToString("00.000" &amp;amp; Environment.NewLine))&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Here is some sample output:&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;62.5&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;15.625&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=1&gt;15.625&lt;/P&gt;&lt;FONT size=1&gt;
&lt;P&gt;15.625&lt;/P&gt;&lt;FONT size=1&gt;
&lt;P&gt;15.625&lt;/P&gt;
&lt;P&gt;31.25&lt;/P&gt;
&lt;P&gt;31.25&lt;/P&gt;
&lt;P&gt;15.625&lt;/P&gt;
&lt;P&gt;(measured in ms)&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;Notice that every single number is evenly divisible by 15.625? Yeah me too. I was very curious to see why this was the case, since I "knew" that DateTime values represent&amp;nbsp;the number of ticks (each tick being 100-nanoseconds) since 01/01/0001. Since each tick has a granularity of 100ns, I saw no problem with&amp;nbsp;using the DateTime structure for the precision&amp;nbsp;that&amp;nbsp;we needed, as&amp;nbsp;we were more concerned with seconds than with nanoseconds.&amp;nbsp;Regardless, it was frustrating me that every call took either the exact same time, or was divisible by 15.625. I began my mission to solve this issue, and learned a lot doing so... I share with you why this happened, and what to do about it.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;Okay, while the DateTime structure can return ticks with a precision of 100ns each, it is only updated 64 times a second, or&lt;FONT&gt; every 15.625 &lt;SPAN class=hm id=misp_compose_29&gt;&lt;SPAN class=hm id=misp_compose_119&gt;milliseconds&lt;/SPAN&gt;&lt;/SPAN&gt; (our magic&lt;/FONT&gt;&lt;FONT&gt; number). So, although&amp;nbsp;the precision is there, the resolution of the timer is not. So, we now know we cannot use the DateTime structure to get accurate timings when the granularity of the time is small. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;Now what?&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;I wrote a class in VB.NET that you can compile into a library and use whenever you need to do your timing. It has 3 exposed methods, StartTimer, ReturnElapsedTime, and ReturnFomattedElapsedTime.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;StartTimer takes in a "identifier" Int32 parameter, so you can have multiple timings per instance of my class.&amp;nbsp;For instance the identifier could be the caller's thread ID&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;(Thread.CurrentThread.ManagedThreadID) &lt;FONT size=3&gt;so you can keep track of&amp;nbsp;multiple threads.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;&lt;FONT size=3&gt;ReturnElapsedTime takes in an identifier that was previousley used as a parameter for StartTimer, and will return the number of seconds in the form of&amp;nbsp;a Double. &lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;&lt;FONT size=3&gt;ReturnFomattedElapsedTime takes in an identifier &lt;FONT&gt;that was &lt;SPAN class=hm id=misp_compose_39&gt;&lt;SPAN class=hm id=misp_compose_129&gt;previously&lt;/SPAN&gt;&lt;/SPAN&gt; used&lt;/FONT&gt;&lt;FONT&gt; as a parameter for StartTimer, and will return the number of seconds in the form of a formatted Double. You can&amp;nbsp;pass in a string&amp;nbsp;format, or just use the default: "00.0000"s.&amp;nbsp;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;&lt;FONT size=3&gt;To use it...&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=3&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; timer &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;New&lt;/FONT&gt;&lt;FONT size=2&gt; HighResTimer()&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; elapsedTime &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;timer.StartTimer(Thread.CurrentThread.ManagedThreadId)&lt;/P&gt;
&lt;P&gt;inventoryAvailability = invTestObj.RequestInventoryStatus(inventoryItems)&lt;/P&gt;
&lt;P&gt;elapsedTime = timer.ReturnFormattedElapsedTime(Thread.CurrentThread.ManagedThreadId, "00.0000")&lt;/P&gt;&lt;FONT size=3&gt;
&lt;P&gt;&lt;FONT color=#000000 size=2&gt;Console.WriteLine(elapsedTime &amp;amp; Environment.NewLine)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can take a look at the results for yourself, it is very simple to use. I will include my source at the bottom of the screen.&lt;/P&gt;
&lt;P&gt;What ended up being used for the timing were 2 API calls from Kernel32.dll, &lt;FONT size=2&gt;&lt;FONT size=3&gt;QueryPerformanceFrequency and QueryPerformanceCounter. They are both unmanaged calls that use&amp;nbsp;a pointer to an Int64 to return their values. The first one returns (by reference) the amount of&amp;nbsp;ticks the current&amp;nbsp;computer can do per second (I have read&amp;nbsp;that this will work with multiprocessor or dual core computers). The second function QueryPerformanceCounter, returns the current processor's amount of&amp;nbsp;ticks. (Minimum resolution: 1/1193182 sec (according to Microsoft)).&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT size=3&gt;Here is my code:&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT size=3&gt;After I learned all about timing, I made this class really quick and did not implement the cost of calling the unmanaged code, so if you decide to throw that logic in there, or there&amp;nbsp;is anything you want to know&amp;nbsp;regarding&amp;nbsp;the&amp;nbsp;explanation above, just let me know. Thanks!&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;Public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Class&lt;/FONT&gt;&lt;FONT size=2&gt; PerformanceTimer&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; timeTracker &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Hashtable&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;New&lt;/FONT&gt;&lt;FONT size=2&gt;()&lt;/P&gt;
&lt;P&gt;timeTracker = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;New&lt;/FONT&gt;&lt;FONT size=2&gt; Hashtable(100) 'I know this isn't the best choice...&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;lt;System.Runtime.InteropServices.DllImport(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Kernel32.dll"&lt;/FONT&gt;&lt;FONT size=2&gt;)&amp;gt; _&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Shared&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; QueryPerformanceFrequency(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByRef&lt;/FONT&gt;&lt;FONT size=2&gt; countsPerSecondForThisMachine &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Boolean&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;lt;System.Runtime.InteropServices.DllImport(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"Kernel32.dll"&lt;/FONT&gt;&lt;FONT size=2&gt;)&amp;gt; _&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Shared&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; QueryPerformanceCounter(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByRef&lt;/FONT&gt;&lt;FONT size=2&gt; counts &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Boolean&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Shared&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; QueryPerformanceCounter() &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; counts &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64&lt;/P&gt;
&lt;P&gt;QueryPerformanceCounter(counts)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; counts&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Shared&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; QueryPerformanceFrequency() &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; countsPerSecondForThisMachine &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64&lt;/P&gt;
&lt;P&gt;QueryPerformanceFrequency(countsPerSecondForThisMachine)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; countsPerSecondForThisMachine&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;Public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/FONT&gt;&lt;FONT size=2&gt; StartTimer(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; identifier &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Integer&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Try&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;If&lt;/FONT&gt;&lt;FONT size=2&gt; timeTracker.ContainsKey(identifier) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Then&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Throw&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;New&lt;/FONT&gt;&lt;FONT size=2&gt; Exception(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/FONT&gt;&lt;FONT size=2&gt;.Format(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"There already is a timer running with identifier '{0}'"&lt;/FONT&gt;&lt;FONT size=2&gt;, identifier))&lt;/P&gt;
&lt;P&gt;timeTracker.Add(identifier, QueryPerformanceCounter())&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Catch&lt;/FONT&gt;&lt;FONT size=2&gt; ex &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Exception&lt;/P&gt;
&lt;P&gt;Console.WriteLine(ex.Message)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Try&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; ReturnElapsedTime(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; identifier &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Integer&lt;/FONT&gt;&lt;FONT size=2&gt;) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; curTime &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64 = QueryPerformanceCounter()&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; startTime &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Int64&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Try&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;If&lt;/FONT&gt;&lt;FONT size=2&gt; timeTracker.ContainsKey(identifier) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Then&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;startTime = timeTracker.Item(identifier)&lt;/P&gt;
&lt;P&gt;timeTracker.Remove(identifier)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CDbl&lt;/FONT&gt;&lt;FONT size=2&gt;((curTime - startTime) / QueryPerformanceFrequency())&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Else&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Throw&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;New&lt;/FONT&gt;&lt;FONT size=2&gt; Exception(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/FONT&gt;&lt;FONT size=2&gt;.Format(&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"There is no timer running with identifier '{0}'"&lt;/FONT&gt;&lt;FONT size=2&gt;, identifier))&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;If&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Catch&lt;/FONT&gt;&lt;FONT size=2&gt; ex &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; Exception&lt;/P&gt;
&lt;P&gt;Console.WriteLine(ex.Message)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/FONT&gt;&lt;FONT size=2&gt;.NaN&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Try&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;Public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; ReturnFormattedElapsedTime(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; identifier &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Integer&lt;/FONT&gt;&lt;FONT size=2&gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Optional&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; strFormat &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/FONT&gt;&lt;FONT size=2&gt; = &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"0.0000"&lt;/FONT&gt;&lt;FONT size=2&gt;) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; retDbl &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/FONT&gt;&lt;FONT size=2&gt; = ReturnElapsedTime(identifier)&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;If&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Not&lt;/FONT&gt;&lt;FONT size=2&gt; retDbl = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/FONT&gt;&lt;FONT size=2&gt;.NaN &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Then&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;CDbl&lt;/FONT&gt;&lt;FONT size=2&gt;(retDbl.ToString(strFormat))&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Else&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Double&lt;/FONT&gt;&lt;FONT size=2&gt;.NaN&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;If&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;
&lt;P&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Class&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.claritycon.com/aggbug.aspx?PostID=526" width="1" height="1"&gt;</content><author><name>mharkabus</name><uri>http://blogs.claritycon.com/members/mharkabus.aspx</uri></author></entry></feed>