📄 intervaltimer.cs
字号:
//////////////////////////////////////////////////////////////////
// 说 明 //
// 这些代码是我自主开发的,其中难免会有很多的BUG,如果您有 //
// 什么发现,或者好的建议请和我联系。在非商业活动中,您可以任意 //
// 使用这些代码,但请不要删除这段说明。 //
// 大家共同学习-共同进步!~~~~~~~~~~~~~ //
// //
// 作者: 秒大刀 //
// 邮箱: dearymz@163.com //
//////////////////////////////////////////////////////////////////
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace ymz.Tools
{
/// <summary>
/// 时间性能测试器
/// 对代码执行时间进行测试
/// 该类在Release模式下仍然会编译运行,注意在Release版本中正确的删除或者使用合适的选择编译
/// </summary>
public class IntervalTimer
{
#region API调用
[DllImport("kernel32.dll")]
static extern private int QueryPerformanceCounter(out long counter);
[DllImport("kernel32.dll")]
static extern private int QueryPerformanceFrequency(out long counter);
#endregion
#region 内部变量
/// <summary>
/// 表示性能时钟的当前状态
/// </summary>
private TimerState state;
/// <summary>
/// 开始计时的tick值
/// </summary>
private long ticksAtStart; // tick count when Started() called
/// <summary>
/// 总共消耗的tick值
/// </summary>
private long intervalTicks; // No. of ticks elaspsed until Stop() called
/// <summary>
/// 当前平台的tick最应的频率值
/// </summary>
private static long frequency;
/// <summary>
/// 频率可以精确到的小数位数
/// </summary>
private static int decimalPlaces;
/// <summary>
/// ToString()方法中使用的格式字符串
/// </summary>
private static string formatString;
/// <summary>
/// 标识该类是否已经初始化
/// </summary>
private static bool initialized = false;
private object mutex = new object();
#endregion
/// <summary>
/// 构造函数
/// 根据平台的不同智能初始化性能测试器
/// </summary>
public IntervalTimer()
{
if(! initialized)
{
QueryPerformanceFrequency(out frequency);
decimalPlaces = (int)Math.Log10(frequency);
// 根据频率的精确度设置当前平台的小数位数
formatString = String.Format("Time interval : {{0:F{0}}} seconds ({{1}} ticks)",decimalPlaces);
initialized = true;
}
state = TimerState.NotStarted;
}
/// <summary>
/// 开始性能测试
/// </summary>
public void Start()
{
if(state == TimerState.Started)
throw new IntervalTimerException("IntervalTimer尚未停止,请先调用Stop方法,然后才能调用Start方法");
lock(mutex)
{
state = TimerState.Started;
QueryPerformanceCounter(out ticksAtStart);
}
}
/// <summary>
/// 结束性能测试
/// </summary>
public void Stop()
{
if(state != TimerState.Started)
throw new IntervalTimerException("IntervalTimer尚未开启,请先调用Start方法开启");
lock(mutex)
{
long current;
QueryPerformanceCounter(out current);
intervalTicks = current - ticksAtStart;
state = TimerState.Stopped;
}
}
/// <summary>
/// 得到测试中总共消耗的秒数
/// </summary>
/// <returns></returns>
public float GetSeconds()
{
if(state != TimerState.Stopped)
throw new IntervalTimerException("IntervalTimer尚未停止,请先调用Stop方法");
return (float)intervalTicks / (float)frequency;
}
public float Seconds
{
get
{
return GetSeconds();
}
}
/// <summary>
/// 得到测试中总共消耗的tick数
/// </summary>
/// <returns></returns>
public long GetIntervalTicks()
{
if(state != TimerState.Stopped)
throw new IntervalTimerException("IntervalTimer尚未停止,请先调用Stop方法");
return intervalTicks;
}
public long IntervalTicks
{
get
{
return GetIntervalTicks();
}
}
/// <summary>
/// 得到当前测试结果的字符串描述
/// 包括消耗的秒和tick等信息
/// </summary>
/// <returns></returns>
public override string ToString()
{
if(state != TimerState.Stopped)
return "Interval timer, state : " + state.ToString();
else
return String.Format(formatString, GetSeconds(), intervalTicks);
}
public void ConsoleShow()
{
Console.WriteLine(this.ToString());
}
public void MessageBoxShow()
{
MessageBox.Show(this.ToString(), "运行时间", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 标识时间性能测试器
/// </summary>
public enum TimerState
{
/// <summary>
/// 时间性能测试器初始化成功,但没有开始测试
/// </summary>
NotStarted,
/// <summary>
/// 测试已经正常结束,可以提取测试结果
/// </summary>
Stopped,
/// <summary>
/// 测试已经开始
/// </summary>
Started
}
public class IntervalTimerException : System.ApplicationException
{
public IntervalTimerException()
: this("")
{
}
public IntervalTimerException(string msg)
: base(msg)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -