在关注性能时,使用DateTime.Today的变量有多重要?

Rac*_*hel 15 c# performance datetime

我刚看到这个赞成的评论

IIRC DateTime.Today是一个相当昂贵的调用,因此您最好先将值存储在变量中.

这是对包含代码的帖子的回应:

var first = 
    new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);
var last = 
    new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddDays(-1);
Run Code Online (Sandbox Code Playgroud)

如果我希望提高性能,那么存储DateTime.Today在变量中而不是多次调用它有多重要?大致有多少用途DateTime.Today可以证明为它创建一个变量?

编辑:我意识到我应该测试我的程序,看看是否存在性能问题,然后再担心像这样微不足道的事情.为了这个问题,假设我已经这样做并确定需要进行额外的优化.

Eri*_* J. 9

将DateTime.Today存储在变量中有多重要

最好的答案是对您希望运行代码的硬件进行基准测试.除非你在一个非常严格的循环中调用它,否则我怀疑这将是一个问题.

将其存储在变量中的更好理由是,您可能会在两次调用之间从一天翻到下一天.

UPDATE

为了提供一个数量级,@ RichardBrown在他的回答中分享了一个链接,表明DateTime.Todayis 的成本被测试为几百纳秒(在用于该测试的特定硬件上).


Rob*_*vey 6

基准测试(在我的机器上,使用秒表类):

10,000 DateTime.Today calls and assignment to local variable: 0.0125781 seconds.

10,000 Assignment only operations: 0.0001062 seconds.
Run Code Online (Sandbox Code Playgroud)

码:

var s = new Stopwatch();
DateTime date = DateTime.Today;
DateTime date2 = DateTime.Today;
s.Start();
for (int i=0; i<10000; i++)
    date = DateTime.Today;
s.Stop();
Debug.Print(s.Elapsed.ToString());

s.Reset();
s.Start();
for (int i=0; i<10000; i++)
    date2 = date;
s.Stop();
Debug.Print(s.Elapsed.ToString());
Run Code Online (Sandbox Code Playgroud)

  • @Rachel:如果两个数量级没有显着差异,那么是的,我想你可以得出这个结论.:)唯一可能的情况是,我可以预见DateTime被多次调用是在报告或批处理过程中,为此,我可能会缓存该值,原因是其他人提到的与性能无关的原因(关于机会)有人在午夜前一分钟运行报告或批处理过程. (2认同)