在性能计数的时候使用StopWatch类型

我们经常需要在代码中对某个方法的执行效率进行确认。例如我们有下面一个方法

static void Run()
{
    for (int i = 0; i < 1000; i++)
    {
        Console.Write(i);
        Thread.Sleep(5);
    }
}

 

我们想知道该方法到底耗用了多少时间执行。传统的做法是在方法执行之前先记录下来当前时间,然后在结束的时候再记录一个时间,然后让他们相减就可以了,类似下面这样

DateTime starttime = DateTime.Now;
    Run();
    TimeSpan span = DateTime.Now.Subtract(starttime);
    Console.WriteLine("执行时间为:{0}毫秒", span.Milliseconds);
    Console.Read();

大概是这样,对吧?一定很眼熟

 

但是这样做的结果不是很精确的,有的时候(如果时间比较短的时候),它可能统计不出来。

从.NET 2.0开始,在System.Diagnostics命名空间里面添加了一个特殊的类型,叫做StopWatch,它可以更加方便地做这样的事情

Stopwatch watch = new Stopwatch();
  watch.Start();//这两句代码也可以缩写为Stopwacth watch=Stopwatch.StartNew()
  Run();//执行该方法
  watch.Stop();
  Console.WriteLine("执行时间为:{0}秒", watch.ElapsedMilliseconds / 1000.0f);
  Console.Read();

看起来不错,难道不是吗?

代码还可以进行下一步的改造,利用C# 3.0的扩展方法这个特性,我们可以编写一个类型

static class ActionExtension
  {
      public static string Profiler(this Action func,int runcount)
      {
          Stopwatch watch = Stopwatch.StartNew();//创建一个监听器
          for (int i = 0; i < runcount; i++)
          {
              func();//执行某个方法
          }
          watch.Stop();

          float sec = watch.ElapsedMilliseconds / 1000.0f;
          float freq = sec / runcount;

          return string.Format("总体执行时间为:{0}秒,总体执行次数为:{1},平均执行时间为:{2}秒", sec, runcount, freq);
      }
  }

这个类型的意思是,扩展了原先的Action这个类型(这是一个委托:delegate)。为它添加一个Profiler方法,返回特定方法的执行时间

Action act = Run;//创建一个指向该run方法的委托
Console.WriteLine(act.Profiler(10));//针对该run方法执行10次
Console.Read();

这样就可以了

posted @ 2009-04-14 09:49  陈希章  阅读(1664)  评论(3编辑  收藏  举报