• 在性能计数的时候使用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();

    这样就可以了

  • 相关阅读:
    学习进度14
    学习进度13
    学习进度12
    2020.12.01 表单元素
    2020.12.02 表单属性
    2020.12.04
    2020.12.06
    2020.12.07
    2020.12.08 URL
    2020.12.09
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1435386.html
Copyright © 2020-2023  润新知