在性能计数的时候使用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();
这样就可以了