当须要知道某段代码到底耗时多少时,使用最最频繁的场景,就是计时开始,计时结束获得耗时时间(一般以毫秒为单位,再转换成秒也是特别容易)。函数
一般状况下,会使用一个变量记录开始时间,结束时再进行时间运算显示结果,但代码有点多,且时间加减本就不容易(哈哈)。而使用其它工具,得找(哈哈),并且它可能给你个并很差关联的名字。工具
那就来自定义一个耗时计数器吧,它有个开始,有个结束,结束时返回耗时计数。关键,这里用一个本身一碰到耗时计数就能想起的名字。spa
于时,有了如下类定义:code
/// <summary> /// 耗时计数器 /// </summary> public class TimeConsumingCounter { // 建立时默认为建立时间,这样不调用 Start 也能够 private DateTime _StartTime = DateTime.Now; // 计时开始 public void Start() { _StartTime = DateTime.Now; } // 计时结束(输出毫秒) public long Over() { var timespan = DateTime.Now - _StartTime; return Convert.ToInt32(timespan.TotalMilliseconds); } }
来来来,看一下使用方法:it
TimeConsumingCounter tcc = new TimeConsumingCounter(); tcc.Start(); for (var i = 0; i < 10000000; i++) { } // 输出耗时计数 Debug.Write(tcc.Over());
也许毫秒并不能知足个人须要,不想再进行秒分的转换。那就再来个 TimeSpan 的返回吧,它自带转换。io
// 取得间隔 public TimeSpan Span() { return DateTime.Now - _StartTime; }
因而输出能够是: Debug.Write(tcc.Span().TotalMinutes);
class
其实,还想更直接点,直接告诉我那个过程运行有多少时间吧。变量
先看看,最终使用的两个示例:
1.示例一原理
Debug.Write( TimeConsumingCounter.TimeConsuming(() => { for (var i = 0; i < 10000000; i++) { } }).TotalMilliseconds );
2.示例二扩展
private void Foo() { for (var i = 0; i < 10000000; i++) { } } // 输出 Foo 运行耗时 Debug.Write( TimeConsumingCounter.TimeConsuming(Foo).TotalMilliseconds );
原理其实很简单,为工具类增长一个静态方法,把须要耗时统计的代码以参数的形式传递给它去计时就能够了。这个方法中,使用到了 Action,是 C# 的一种委托,可先熟悉下。静态方法以下:
/// <summary> /// 静态方法,运行指定函数,返回耗时结果 /// </summary> /// <param name="action"></param> /// <returns></returns> public static TimeSpan TimeConsuming(Action action) { TimeConsumingCounter tcc = new TimeConsumingCounter(); action(); return tcc.Span(); }
/// <summary> /// 耗时计数器 /// </summary> public class TimeConsumingCounter { // 建立时默认为建立时间,这样不调用 Start 也能够 private DateTime _StartTime = DateTime.Now; // 计时开始 public void Start() { _StartTime = DateTime.Now; } // 计时结束(输出毫秒) public long Over() { var timespan = DateTime.Now - _StartTime; return Convert.ToInt32(timespan.TotalMilliseconds); } // 取得间隔 public TimeSpan Span() { return DateTime.Now - _StartTime; } /// <summary> /// 静态方法,运行指定函数,返回耗时结果 /// </summary> /// <param name="action"></param> /// <returns></returns> public static TimeSpan TimeConsuming(Action action) { TimeConsumingCounter tcc = new TimeConsumingCounter(); action(); return tcc.Span(); } }