获取当前时间的有效方法

Mar*_*B42 2 c# datetime

我正在使用 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; }
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,我的班级可以有一名成员private Time _time;,并_time.Now;可以在需要了解当前时间的任何时候拨打电话。

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

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

wag*_*ghe 5

请参阅此问题,讨论为什么 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)的结果是这样的情况下。 UtcNow) 将与上次调用时相同。我还没有对它进行基准测试,所以我无法告诉你这是否真的更快。或者,如果是的话,您需要执行多少次当前时间操作才能看到好处。

祝你好运!