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