获得当前时间的有效方法

时间:2013-10-15 21:41:53

标签: 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; }
    }

}

现在我的班级可以有一名成员private Time _time;并在想知道当前时间时随时致电_time.Now;

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

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

2 个答案:

答案 0 :(得分:3)

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

Why are DateTime.Now DateTime.UtcNow so slow/expensive

如果您将在该主题中查看我的答案(我没有任何关于为什么这些操作“如此慢”(如果确实如此)的信息),但我确实从NLog分享了一些明显的代码试图在可能有许多当前时间请求的情况下优化当前时间的检索。

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

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

祝你好运!

答案 1 :(得分:2)

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

DateTime.GetSystemTimeAsFileTime()

以下是该方法的MSDN documentation,此处为stackoverflow post,其中包含更多详细信息。