using System; using System.ComponentModel; using System.Runtime.InteropServices; using System.Threading; namespace Masuit.Tools.Systems; /// /// 纳秒级计时器,仅支持Windows系统 /// public class HiPerfTimer { [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); [DllImport("Kernel32.dll")] private static extern bool QueryPerformanceFrequency(out long clock); private long _startTime; private long _stopTime; private readonly long _exFreq; /// /// 纳秒计数器 /// public HiPerfTimer() { _startTime = 0; _stopTime = 0; if (QueryPerformanceFrequency(out _exFreq) == false) { throw new Win32Exception("不支持高性能计数器"); } } /// /// 开始计时器 /// public void Start() { // 让等待线程工作 Thread.Sleep(0); QueryPerformanceCounter(out _startTime); } /// /// 开始计时器 /// public void Restart() { _startTime = 0; Start(); } /// /// 停止计时器 /// public double Stop() { QueryPerformanceCounter(out _stopTime); return Duration; } /// /// 启动一个新的计时器 /// /// public static HiPerfTimer StartNew() { HiPerfTimer timer = new HiPerfTimer(); timer.Start(); return timer; } /// /// 时器经过时间(单位:秒) /// public double Duration => (_stopTime - _startTime) / (double)_exFreq; public double DurationNanoseconds => (_stopTime - _startTime) * 100; /// /// 时器经过的总时间(单位:秒) /// public double Elapsed { get { Stop(); return Duration; } } /// /// 时器经过的总时间(单位:纳秒) /// public double ElapsedNanoseconds { get { Stop(); return DurationNanoseconds; } } /// /// 执行一个方法并测试执行时间 /// /// /// public static double Execute(Action action) { var timer = new HiPerfTimer(); timer.Start(); action(); timer.Stop(); return timer.Duration; } }