1
1

HiPerfTimer.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. using System.ComponentModel;
  3. using System.Runtime.InteropServices;
  4. using System.Threading;
  5. namespace Masuit.Tools.Systems;
  6. /// <summary>
  7. /// 纳秒级计时器,仅支持Windows系统
  8. /// </summary>
  9. public class HiPerfTimer
  10. {
  11. [DllImport("Kernel32.dll")]
  12. private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
  13. [DllImport("Kernel32.dll")]
  14. private static extern bool QueryPerformanceFrequency(out long clock);
  15. private long _startTime;
  16. private long _stopTime;
  17. private readonly long _exFreq;
  18. /// <summary>
  19. /// 纳秒计数器
  20. /// </summary>
  21. public HiPerfTimer()
  22. {
  23. _startTime = 0;
  24. _stopTime = 0;
  25. if (QueryPerformanceFrequency(out _exFreq) == false)
  26. {
  27. throw new Win32Exception("不支持高性能计数器");
  28. }
  29. }
  30. /// <summary>
  31. /// 开始计时器
  32. /// </summary>
  33. public void Start()
  34. {
  35. // 让等待线程工作
  36. Thread.Sleep(0);
  37. QueryPerformanceCounter(out _startTime);
  38. }
  39. /// <summary>
  40. /// 开始计时器
  41. /// </summary>
  42. public void Restart()
  43. {
  44. _startTime = 0;
  45. Start();
  46. }
  47. /// <summary>
  48. /// 停止计时器
  49. /// </summary>
  50. public double Stop()
  51. {
  52. QueryPerformanceCounter(out _stopTime);
  53. return Duration;
  54. }
  55. /// <summary>
  56. /// 启动一个新的计时器
  57. /// </summary>
  58. /// <returns></returns>
  59. public static HiPerfTimer StartNew()
  60. {
  61. HiPerfTimer timer = new HiPerfTimer();
  62. timer.Start();
  63. return timer;
  64. }
  65. /// <summary>
  66. /// 时器经过时间(单位:秒)
  67. /// </summary>
  68. public double Duration => (_stopTime - _startTime) / (double)_exFreq;
  69. public double DurationNanoseconds => (_stopTime - _startTime) * 100;
  70. /// <summary>
  71. /// 时器经过的总时间(单位:秒)
  72. /// </summary>
  73. public double Elapsed
  74. {
  75. get
  76. {
  77. Stop();
  78. return Duration;
  79. }
  80. }
  81. /// <summary>
  82. /// 时器经过的总时间(单位:纳秒)
  83. /// </summary>
  84. public double ElapsedNanoseconds
  85. {
  86. get
  87. {
  88. Stop();
  89. return DurationNanoseconds;
  90. }
  91. }
  92. /// <summary>
  93. /// 执行一个方法并测试执行时间
  94. /// </summary>
  95. /// <param name="action"></param>
  96. /// <returns></returns>
  97. public static double Execute(Action action)
  98. {
  99. var timer = new HiPerfTimer();
  100. timer.Start();
  101. action();
  102. timer.Stop();
  103. return timer.Duration;
  104. }
  105. }