0

我正在使用 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;来了解当前时间。

我的当前时间可能会稍微偏离一点(我正在尝试测量延迟并想知道我是否慢了几秒钟或更长时间),但我确实希望能够查看当前时间很多没有大量系统调用的性能损失。

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

4

2 回答 2

3

关于为什么 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.Now)的结果的情况下。 UtcNow) 将与上次调用时相同。我没有对它进行基准测试,所以我不能告诉你这是否真的更快。或者,如果是,您将执行多少当前时间操作才能看到收益。

祝你好运!

于 2013-10-15T22:11:26.970 回答
2

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

DateTime.GetSystemTimeAsFileTime()

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

于 2013-10-15T21:58:32.123 回答