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;
}
}