获取当前时间的有效方法

本文关键字:有效 方法 时间 获取 | 更新日期: 2023-09-27 18:35:25

我正在使用 c#,据我了解(主要使用 c++),DateTime.Now获取系统时间可能会很慢。我正在尝试通过使用计时器/Stopwatch来改进这一点

class Time {
    private DateTime _starttime;
    private Stopwatch _timer;
    public Time() {
        _timer = new Stopwatch();
        _starttime = DateTime.Now; //trying to improve on multiple calls to `DateTime.Now` by only calling it once
        _timer.start;
    }
    public DateTime Now {
        get { return _starttime + _timer.Elapsed; }
    }
}

现在,我的类可以有一个成员private Time _time;,并随时呼叫_time.Now;它想知道当前时间。

当前的时间可能会偏离一点点(我正在尝试测量延迟并想知道我是否慢了几秒钟或更长时间),但我确实希望能够查看当前时间,而不会受到大量系统调用的性能影响。

当我开始创建一些性能测试时,我想知道是否有人知道更好/不同的方法(或者也许有人知道我是否完全偏离了基础)。

获取当前时间的有效方法

在SO上看到这个问题,讨论为什么DateTime.Now和DateTime.UtcNow如此缓慢/昂贵...

为什么DateTime.Now DateTime.UtcNow如此缓慢/昂贵

如果您查看该线程中的答案(我没有关于为什么这些操作"如此慢"的任何信息(如果确实如此)),但我确实分享了一些来自 NLog 的代码,这些代码显然试图在当前时间可能有许多请求的上下文中优化当前时间的检索。

实质上,在确定当前时间时,NLog 会缓存 DateTime.UtcNow 的结果。 对于将来的请求,如果当前时钟周期计数 (Environment.TickCount) 与上次相同,则返回缓存的 DateTime.UtcNow 值。 否则,获取当前 DateTime.UtcNow 值并保存 Environment.TickCount。

无论 DateTime.Now 和 DateTime.UtcNow 是否"慢",

NLog 代码确实提供了一种有趣的方法来避免获取当前时间的"慢"部分,以防 DateTime.Now(或 DateTime.UtcNow)的结果与上次调用时相同。 我没有对它进行基准测试,所以我不能告诉你这是否真的更快。 或者,如果是,在看到好处之前,您将执行多少个当前时间操作。

祝你好运!

我很

好奇,所以我检查了一下。 DateTime.Now内部调用 DateTime.UtcNow ,而 又调用内部 CLR 方法:

DateTime.GetSystemTimeAsFileTime()

这是该方法的MSDN文档,这是包含更多详细信息的stackoverflow帖子。