Browse Source

改进纳秒计算

懒得勤快 4 years ago
parent
commit
2f2e3bfc85

+ 15 - 2
Masuit.Tools.Abstractions/DateTimeExt/DateTimeHelper.cs

@@ -101,7 +101,7 @@ namespace Masuit.Tools.DateTimeExt
         }
 
         /// <summary>
-        /// 设置本地计算机时间
+        /// 设置本地计算机系统时间,仅支持Windows系统
         /// </summary>
         /// <param name="dt">DateTime对象</param>
         public static void SetLocalTime(this in DateTime dt)
@@ -155,12 +155,25 @@ namespace Masuit.Tools.DateTimeExt
         /// <returns></returns>
         public static long GetTotalMicroseconds(this in DateTime dt) => (new DateTimeOffset(dt).UtcTicks - 621355968000000000) / 10;
 
+        [DllImport("Kernel32.dll")]
+        private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
+
         /// <summary>
         /// 获取该时间相对于1970-01-01T00:00:00Z的纳秒时间戳
         /// </summary>
         /// <param name="dt"></param>
         /// <returns></returns>
-        public static long GetTotalNanoseconds(this in DateTime dt) => (new DateTimeOffset(dt).UtcTicks - 621355968000000000) * 100 + Stopwatch.GetTimestamp() % 100;
+        public static long GetTotalNanoseconds(this in DateTime dt)
+        {
+            var ticks = (new DateTimeOffset(dt).UtcTicks - 621355968000000000) * 100;
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+            {
+                QueryPerformanceCounter(out var timestamp);
+                return ticks + timestamp % 100;
+            }
+
+            return ticks + Stopwatch.GetTimestamp() % 100;
+        }
 
         /// <summary>
         /// 获取该时间相对于1970-01-01T00:00:00Z的分钟数

+ 1 - 1
Masuit.Tools.Abstractions/Files/INIFile.cs

@@ -5,7 +5,7 @@ using System.Text;
 namespace Masuit.Tools.Files
 {
     /// <summary>
-    /// INI文件操作辅助类
+    /// INI文件操作辅助类,仅支持Windows系统
     /// </summary>
     public class INIFile
     {

+ 1 - 1
Masuit.Tools.Abstractions/Hardware/SystemInfo.cs

@@ -13,7 +13,7 @@ using System.Text;
 namespace Masuit.Tools.Hardware
 {
     /// <summary>
-    /// 硬件信息,部分功能需要C++支持
+    /// 硬件信息,部分功能需要C++支持,仅支持Windows系统
     /// </summary>
     public static partial class SystemInfo
     {

+ 19 - 6
Masuit.Tools.Abstractions/Systems/HiPerfTimer.cs

@@ -6,7 +6,7 @@ using System.Threading;
 namespace Masuit.Tools.Systems
 {
     /// <summary>
-    /// 纳秒级计时器
+    /// 纳秒级计时器,仅支持Windows系统
     /// </summary>
     public class HiPerfTimer
     {
@@ -14,11 +14,11 @@ namespace Masuit.Tools.Systems
         private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
 
         [DllImport("Kernel32.dll")]
-        private static extern bool QueryPerformanceFrequency(out long lpFrequency);
+        private static extern bool QueryPerformanceFrequency(out long clock);
 
         private long _startTime;
         private long _stopTime;
-        private readonly long _freq;
+        private readonly long _exFreq;
 
         /// <summary>
         /// 纳秒计数器
@@ -27,7 +27,7 @@ namespace Masuit.Tools.Systems
         {
             _startTime = 0;
             _stopTime = 0;
-            if (QueryPerformanceFrequency(out _freq) == false)
+            if (QueryPerformanceFrequency(out _exFreq) == false)
             {
                 throw new Win32Exception("不支持高性能计数器");
             }
@@ -75,10 +75,11 @@ namespace Masuit.Tools.Systems
         /// <summary>
         /// 时器经过时间(单位:秒)
         /// </summary>
-        public double Duration => (_stopTime - _startTime) / (double)_freq;
+        public double Duration => (_stopTime - _startTime) / (double)_exFreq;
+        public double DurationNanoseconds => _stopTime - _startTime;
 
         /// <summary>
-        /// 时器经过的总时间
+        /// 时器经过的总时间(单位:秒)
         /// </summary>
         public double Elapsed
         {
@@ -89,6 +90,18 @@ namespace Masuit.Tools.Systems
             }
         }
 
+        /// <summary>
+        /// 时器经过的总时间(单位:纳秒)
+        /// </summary>
+        public double ElapsedNanoseconds
+        {
+            get
+            {
+                Stop();
+                return DurationNanoseconds;
+            }
+        }
+
         /// <summary>
         /// 执行一个方法并测试执行时间
         /// </summary>

+ 3 - 3
Masuit.Tools.NoSQL.MongoDBClient/Masuit.Tools.NoSQL.MongoDBClient.csproj

@@ -38,9 +38,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="MongoDB.Bson" Version="2.12.1" />
-    <PackageReference Include="MongoDB.Driver" Version="2.12.1" />
-    <PackageReference Include="MongoDB.Driver.Core" Version="2.12.1" />
+    <PackageReference Include="MongoDB.Bson" Version="2.12.2" />
+    <PackageReference Include="MongoDB.Driver" Version="2.12.2" />
+    <PackageReference Include="MongoDB.Driver.Core" Version="2.12.2" />
   </ItemGroup>
 
 </Project>

+ 1 - 1
Test/Masuit.Tools.Abstractions.Test/Masuit.Tools.Abstractions.Test.csproj

@@ -13,7 +13,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
     <PackageReference Include="xunit" Version="2.4.1" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
       <PrivateAssets>all</PrivateAssets>

+ 2 - 2
Test/Masuit.Tools.Core.Test/Masuit.Tools.Core.Test.csproj

@@ -9,9 +9,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.4" />
+    <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.5" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.1" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
     <PackageReference Include="xunit" Version="2.4.1" />
     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
       <PrivateAssets>all</PrivateAssets>