代码运行计时类
今天想找一下程序执行时间的类,在网上搜了一下,看到有位朋友 hbb0b0 的一篇文章可以很方便的计算执行时间(地址:http://www.cnblogs.com/hbb0b0/archive/2009/05/30/1491808.html)
代码如下:
OperationTimer
1 public class OperationTimer : IDisposable
2 {
3 private Int64 m_startTime;
4 private string m_text;
5 private Int32 m_CollectionCount;
6
7 public OperationTimer(string text)
8 {
9 m_startTime = Stopwatch.GetTimestamp();
10 m_text = text;
11 }
12
13 public void Dispose()
14 {
15 string text = string.Format("Time={0,6:###.00}", (Stopwatch.GetTimestamp() - m_startTime) / Stopwatch.Frequency);
16 Console.WriteLine(string.Format("{0}:{1}", m_text, text));
17 }
18 }
2 {
3 private Int64 m_startTime;
4 private string m_text;
5 private Int32 m_CollectionCount;
6
7 public OperationTimer(string text)
8 {
9 m_startTime = Stopwatch.GetTimestamp();
10 m_text = text;
11 }
12
13 public void Dispose()
14 {
15 string text = string.Format("Time={0,6:###.00}", (Stopwatch.GetTimestamp() - m_startTime) / Stopwatch.Frequency);
16 Console.WriteLine(string.Format("{0}:{1}", m_text, text));
17 }
18 }
试了一下果然很好用。程序很简单,就是在一个类继承自IDisposable接口的类的构造函数中记录下开始时间,在销毁时计算一下时间差,就可得到相应的执行时间。使用也很巧妙,直接 using (OperationTimer op=new OperationTimer ("Generic ")){...} ,很爽很简洁的实现了想要的功能。
不过有个小情况,就是本人平时时 asp.net 下写的代码,如果每次都拿到控制台中运行,不太方便,如果能改造一下,让这个类既能在控制台下运行也可以在asp.net 的环境下方便使用就好了。
看了一下这个类的实现原理,由于是在类被销毁时才计算运行时间差,没有更多的空间可以去获取这个时间。似乎只有搞一个委托,让程序要以在销毁时执行,把这个时间传递需要的地方。呵呵,写了这么久的程序,也看了很多次的委托,因为实际中基本没有用上过,所以对写法不太熟,正好重温一下。下面是改造过程。
第一步:将这个类按自己习贯的方式修改一下命名,并为了能简单调用,增加了一个构造函数,代码如下:
代码
/// <summary>
/// 计算执行时间的类
/// 原文 //http://www.cnblogs.com/hbb0b0/archive/2009/05/30/1491808.html/
/// 修改:增加了委托方法
/// 时间:2009-12-8
/// </summary>
class CodeTimer : IDisposable
{
private Int64 _StartTime;
private string _Text;
public CodeTimer()
: this("CodeTimer")
{
}
public CodeTimer(string text)
{
_StartTime = Stopwatch.GetTimestamp();
_Text = text;
}
public void Dispose()
{
Int64 _runTime = (Stopwatch.GetTimestamp() - _StartTime) / Stopwatch.Frequency;//返回时间 秒
string text = string.Format("Time={0,6:###.00}", _runTime);
Console.WriteLine(string.Format("{0}:{1}", _Text, text));
}
}
/// 计算执行时间的类
/// 原文 //http://www.cnblogs.com/hbb0b0/archive/2009/05/30/1491808.html/
/// 修改:增加了委托方法
/// 时间:2009-12-8
/// </summary>
class CodeTimer : IDisposable
{
private Int64 _StartTime;
private string _Text;
public CodeTimer()
: this("CodeTimer")
{
}
public CodeTimer(string text)
{
_StartTime = Stopwatch.GetTimestamp();
_Text = text;
}
public void Dispose()
{
Int64 _runTime = (Stopwatch.GetTimestamp() - _StartTime) / Stopwatch.Frequency;//返回时间 秒
string text = string.Format("Time={0,6:###.00}", _runTime);
Console.WriteLine(string.Format("{0}:{1}", _Text, text));
}
}
第二步:增加一个 public delegate void OnCompletedEventHandle(Int64 RunTime); 的委托,用以把程序执行时的运行时间传递出来
第三步:增加一个事件,以便在程序运行完了后执行 代码如下:public event OnCompletedEventHandle OnCompleted;
第四步:在销毁时判断是否有事件的委托,有则调用。代码如下:
if (OnCompleted != null)
OnCompleted.Invoke(_runTime);
这样就行了,以后你在使用时只需要加上句完成后的事件就可以把执行时间。如:
using (CodeTimer ct = new CodeTimer())
{
ct.OnCompleted += new CodeTimer.OnCompletedEventHandle(ShowTime);
.....
}
第五步,你就可以在以下代码中为所欲为了
static void ShowTime(Int64 runtime)
{
Console.WriteLine(string.Format("RunTime:{0,6:###.00}s", runtime));
}
{
Console.WriteLine(string.Format("RunTime:{0,6:###.00}s", runtime));
}
这样就可以把想要的数据传递出来了。OK了,加入到自己的常用类中,以后就可以直接使用了。
写到这里想起了之前在asp.net 中写的一个计算整个页面执行时间(服务器端+客户端执行时间)的方法,时间不早了,吃饭先,下次接着写.