C# Programming

C# 精准计时:毫秒级掌控

Spread the love

精确的时间记录对于各种编程任务至关重要,从记录事件到性能测量。虽然秒通常就足够了,但许多应用程序需要毫秒级的精度才能进行精确计时。本文探讨如何在 C# 中实现这一点。

目录

  1. C# 中的日期和时间基础
  2. 在 C# 中使用毫秒
  3. 实际示例:获取毫秒
  4. 选择正确的方法

C# 中的日期和时间基础

C# 通过DateTimeDateTimeOffset结构提供了强大的日期和时间处理功能。这些结构提供了各种属性和方法来操作日期和时间信息。但是,直接访问毫秒需要更深入地了解这些工具。

在 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.TicksStopwatch提供了足够的精度。只有在绝对需要极高精度(微秒或纳秒)时才使用QueryPerformanceCounter

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注