当需要知道某段代码到底耗时多少时,使用最最频繁的场景,就是计时开始,计时结束得到耗时时间(通常以毫秒为单位,再转换成秒也是特别容易)。
通常情况下,会使用一个变量记录开始时间,结束时再进行时间运算显示结果,但代码有点多,且时间加减本就不容易(哈哈)。而使用其它工具,得找(哈哈),而且它可能给你个并不好关联的名字。
那就来自定义一个耗时计数器吧,它有个开始,有个结束,结束时返回耗时计数。关键,这里用一个自己一碰到耗时计数就能想起的名字。
开始定义
于时,有了以下类定义:
/// <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);
}
}
来来来,看一下使用方法:
TimeConsumingCounter tcc = new TimeConsumingCounter();
tcc.Start();
for (var i = 0; i < 10000000; i++)
{
}
// 输出耗时计数
Debug.Write(tcc.Over());
稍作扩展
也许毫秒并不能满足我的需要,不想再进行秒分的转换。那就再来个 TimeSpan 的返回吧,它自带转换。
// 取得间隔
public TimeSpan Span()
{
return DateTime.Now - _StartTime;
}
于是输出可以是: Debug.Write(tcc.Span().TotalMinutes);
其实,还想更直接点,直接告诉我那个过程运行有多少时间吧。
先看看,最终使用的两个示例:
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();
}
}