<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: precision timer code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 12:18:29 GMT</pubDate>
    <description>DZone Snippets: precision timer code</description>
    <item>
      <title>Benchmark/performance timers</title>
      <link>http://snippets.dzone.com/posts/show/3920</link>
      <description>Usage:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;            NormalTimer timer1 = new NormalTimer();&lt;br /&gt;            timer1.Start();&lt;br /&gt;            for (int i = 0; i &lt; 1000 * 1000 * 1000; i++) ;&lt;br /&gt;            timer1.Stop();&lt;br /&gt;            Console.WriteLine("Duration: {0} seconds", timer1.durationS);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            PrecisionTimer timer2 = new PrecisionTimer();&lt;br /&gt;            timer2.Start();&lt;br /&gt;            for (int i = 0; i &lt; 1000 * 1000 * 1000; i++) ;&lt;br /&gt;            timer2.Stop();&lt;br /&gt;            Console.WriteLine("Duration: {0} seconds", timer2.durationS);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;  internal class UnmanagedApi&lt;br /&gt;  {&lt;br /&gt;   [DllImport("Kernel32.dll")]&lt;br /&gt;   internal static extern bool QueryPerformanceCounter(&lt;br /&gt;    out long lpPerformanceCount);&lt;br /&gt;&lt;br /&gt;   [DllImport("Kernel32.dll")]&lt;br /&gt;   internal static extern bool QueryPerformanceFrequency(&lt;br /&gt;    out long lpFrequency);&lt;br /&gt;  }&lt;br /&gt; public class PrecisionTimer&lt;br /&gt; {&lt;br /&gt;  private long startTick;&lt;br /&gt;  private long stopTick;&lt;br /&gt;  private long tickFrequency;&lt;br /&gt;  public PrecisionTimer()&lt;br /&gt;  {&lt;br /&gt;   UnmanagedApi.QueryPerformanceFrequency(out tickFrequency);&lt;br /&gt;  }&lt;br /&gt;  internal class UnmanagedApi&lt;br /&gt;  {&lt;br /&gt;   [DllImport("Kernel32.dll")]&lt;br /&gt;   internal static extern bool QueryPerformanceCounter(&lt;br /&gt;    out long lpPerformanceCount);&lt;br /&gt;   [DllImport("Kernel32.dll")]&lt;br /&gt;   internal static extern bool QueryPerformanceFrequency(&lt;br /&gt;    out long lpFrequency);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void Start()&lt;br /&gt;  {&lt;br /&gt;   Thread.Sleep(0); //execute waiting threads first, then continue&lt;br /&gt;   GC.Collect();&lt;br /&gt;   GC.WaitForPendingFinalizers();&lt;br /&gt;   GC.Collect();&lt;br /&gt;   UnmanagedApi.QueryPerformanceCounter(out startTick);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void Stop()&lt;br /&gt;  {&lt;br /&gt;   UnmanagedApi.QueryPerformanceCounter(out stopTick);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static long Tick()&lt;br /&gt;  {&lt;br /&gt;   long retVal;&lt;br /&gt;   UnmanagedApi.QueryPerformanceCounter(out retVal); &lt;br /&gt;   return retVal;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private long ticks&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    if (startTick &gt; stopTick)&lt;br /&gt;    {&lt;br /&gt;     startTick = stopTick = 0;&lt;br /&gt;     return 0;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     return (stopTick - startTick);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  public void WriteLine()&lt;br /&gt;  {&lt;br /&gt;   Console.WriteLine("{0} ms", durationMs);&lt;br /&gt;  }&lt;br /&gt;  public double durationS&lt;br /&gt;  {&lt;br /&gt;   get { return (double) ticks/tickFrequency; }&lt;br /&gt;  }&lt;br /&gt;  public double durationMs&lt;br /&gt;  {&lt;br /&gt;   get { return durationS*1000; }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; public class NormalTimer&lt;br /&gt; {&lt;br /&gt;  private long startTick;&lt;br /&gt;  private long stopTick;&lt;br /&gt;  public void Start()&lt;br /&gt;  {&lt;br /&gt;   Thread.Sleep(0); //execute waiting threads first, then continue&lt;br /&gt;   startTick = Environment.TickCount;&lt;br /&gt;  }&lt;br /&gt;  public void Stop()&lt;br /&gt;  {&lt;br /&gt;   stopTick = Environment.TickCount;&lt;br /&gt;  }&lt;br /&gt;  private long ticks&lt;br /&gt;  {&lt;br /&gt;   get&lt;br /&gt;   {&lt;br /&gt;    if (startTick &gt; stopTick)&lt;br /&gt;    {&lt;br /&gt;     startTick = stopTick = 0;&lt;br /&gt;     return 0;&lt;br /&gt;    }&lt;br /&gt;    else&lt;br /&gt;    {&lt;br /&gt;     return (stopTick - startTick);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public long durationMs&lt;br /&gt;  {&lt;br /&gt;   get { return ticks; }&lt;br /&gt;  }&lt;br /&gt;  public double durationS&lt;br /&gt;  {&lt;br /&gt;   get { return (double) ticks/1000; }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 27 Apr 2007 07:26:39 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3920</guid>
      <author>mstampar (Miroslav Stampar)</author>
    </item>
  </channel>
</rss>
