⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intervaltimer.cs

📁 /// 时间性能测试器 /// 对代码执行时间进行测试 /// 该类在Release模式下仍然会编译运行
💻 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 + -