在C#中,有幾種方法可以獲取高精度時間(高分辨率時間戳),適用于性能測量、計時等需要高精度的場景。以下是幾種常用方法:
1. 使用 Stopwatch
類(推薦)
Stopwatch
類提供了最高精度的時間測量,適用于測量時間間隔。
using System;
using System.Diagnostics;class Program
{static void Main(){// 創建Stopwatch實例Stopwatch stopwatch = new Stopwatch();// 開始計時stopwatch.Start();// 執行一些操作for (int i = 0; i < 1000000; i++){var x = Math.Sqrt(i);}// 停止計時stopwatch.Stop();// 獲取經過的時間Console.WriteLine($"Elapsed Time: {stopwatch.Elapsed}");Console.WriteLine($"Elapsed Milliseconds: {stopwatch.ElapsedMilliseconds}");Console.WriteLine($"Elapsed Ticks: {stopwatch.ElapsedTicks}");// 檢查計時器頻率Console.WriteLine($"Frequency: {Stopwatch.Frequency} ticks per second");Console.WriteLine($"IsHighResolution: {Stopwatch.IsHighResolution}");}
}
2. 使用 DateTime.UtcNow
(精度較低)
雖然不如 Stopwatch
精確,但在某些簡單場景下可以使用:
DateTime startTime = DateTime.UtcNow;// 執行一些操作
for (int i = 0; i < 1000000; i++)
{var x = Math.Sqrt(i);
}DateTime endTime = DateTime.UtcNow;
TimeSpan elapsed = endTime - startTime;Console.WriteLine($"Elapsed Time: {elapsed}");
3. 使用 P/Invoke 調用 Windows 高精度計時器
如果需要更高精度或與原生代碼交互,可以使用 Windows API:
using System;
using System.Runtime.InteropServices;class Program
{[DllImport("kernel32.dll")]private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);[DllImport("kernel32.dll")]private static extern bool QueryPerformanceFrequency(out long lpFrequency);static void Main(){long frequency;QueryPerformanceFrequency(out frequency);long start;QueryPerformanceCounter(out start);// 執行一些操作for (int i = 0; i < 1000000; i++){var x = Math.Sqrt(i);}long end;QueryPerformanceCounter(out end);double elapsed = (end - start) / (double)frequency;Console.WriteLine($"Elapsed Time: {elapsed} seconds");}
}
4. 使用 .NET Core 3.0+ 的 TimeProvider
(.NET 6+)
在 .NET 6 及更高版本中,可以使用 TimeProvider
抽象:
using System;var timeProvider = TimeProvider.System;
long startTimestamp = timeProvider.GetTimestamp();// 執行一些操作
for (int i = 0; i < 1000000; i++)
{var x = Math.Sqrt(i);
}long endTimestamp = timeProvider.GetTimestamp();
double elapsed = timeProvider.GetElapsedTime(startTimestamp, endTimestamp).TotalSeconds;Console.WriteLine($"Elapsed Time: {elapsed} seconds");
注意事項
-
精度差異:
Stopwatch
通常提供最高精度(取決于硬件,可能是微秒級)DateTime
的精度通常約為10-15毫秒- Windows 的
QueryPerformanceCounter
通常與Stopwatch
精度相同
-
跨平臺考慮:
Stopwatch
在所有平臺上都能提供最佳可用精度- 直接 P/Invoke 方法僅適用于 Windows
-
時間戳與日歷時間:
- 高精度計時器通常返回的是相對于某個任意起點的時間戳,不是日歷時間
- 如果需要日歷時間,應使用
DateTime.UtcNow
或DateTimeOffset.UtcNow
對于大多數性能測量場景,Stopwatch
是最佳選擇。
注:內容由AI生成