精确的时间记录对于各种编程任务至关重要,从记录事件到性能测量。虽然秒通常就足够了,但许多应用程序需要毫秒级的精度才能进行精确计时。本文探讨如何在 C# 中实现这一点。
目录
C# 中的日期和时间基础
C# 通过DateTime
和DateTimeOffset
结构提供了强大的日期和时间处理功能。这些结构提供了各种属性和方法来操作日期和时间信息。但是,直接访问毫秒需要更深入地了解这些工具。
在 C# 中使用毫秒
核心概念在于理解Ticks
属性。DateTime
结构表示一个时间点,Ticks
返回自公元0001年1月1日午夜12:00:00以来的100纳秒间隔数。要获得毫秒,我们将Ticks
值除以TimeSpan.TicksPerMillisecond
(10,000)。
实际示例:获取毫秒
方法 1:使用DateTime.Now.Ticks
这是获取当前时间(以毫秒为单位)最直接的方法:
using System;
public class MillisecondsExample
{
public static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
long milliseconds = ticks / TimeSpan.TicksPerMillisecond;
Console.WriteLine($"当前时间(毫秒):{milliseconds}");
}
}
方法 2:使用Stopwatch
测量经过时间
Stopwatch
类擅长测量经过时间,与直接使用DateTime.Now
相比,它在短时间内具有更好的精度。这非常适合性能基准测试。
using System;
using System.Diagnostics;
public class StopwatchExample
{
public static void Main(string[] args)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
// 要计时的代码...
System.Threading.Thread.Sleep(500); // 模拟一些工作
stopwatch.Stop();
long milliseconds = stopwatch.ElapsedMilliseconds;
Console.WriteLine($"经过时间(毫秒):{milliseconds}");
}
}
方法 3:高分辨率计时器(适用于高级需求)
对于极高的精度,请考虑QueryPerformanceCounter
API。但是,请记住,这是依赖于平台的,精度因硬件而异。除非您需要微秒或纳秒精度,否则通常不需要它。
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class HighResolutionTimerExample
{
public static void Main(string[] args)
{
long frequency;
long startTime;
long endTime;
QueryPerformanceFrequency(out frequency);
QueryPerformanceCounter(out startTime);
// 要计时的代码...
System.Threading.Thread.Sleep(500); // 模拟一些工作
QueryPerformanceCounter(out endTime);
long elapsedTicks = endTime - startTime;
double elapsedMilliseconds = (double)elapsedTicks / frequency * 1000;
Console.WriteLine($"经过时间(毫秒):{elapsedMilliseconds}");
}
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceFrequency(out long lpFrequency);
[DllImport("Kernel32.dll")]
private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
}
选择正确的方法
选择最适合您的应用程序需求的方法。对于大多数场景,DateTime.Now.Ticks
或Stopwatch
提供了足够的精度。只有在绝对需要极高精度(微秒或纳秒)时才使用QueryPerformanceCounter
。