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

我刚看到这个赞成的评论

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

这是对包含代码的post的回应:

 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); 

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

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

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

 10,000 DateTime.Today calls and assignment to local variable: 0.0125781 seconds. 10,000 Assignment only operations: 0.0001062 seconds. 

码:

 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()); 

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

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

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

UPDATE

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

我拒绝DateTime.Today是一个昂贵的电话的前提。 如果重要的是它不随时间变化,则应将其存储在变量中。 如果这段代码在一个月末的午夜左右运行,你可能会遇到……问题。 从性能角度来看,我非常怀疑这是一个问题。

无论如何,这将是一种微观优化。 与任何性能问题一样,如果您的工作程序太慢,您应该对其进行分析并查找需要花费大量时间的部分并专注于优化这些部分,寻找代码花费的时间比您预期的更多。 如果发生这一行代码消耗了大量时间,那么请考虑更改它。 在此之前,只重构它的正确性或可读性,而不是性能。

对于关于DateTime性能的硬数据,请阅读此博客文章 。 如前所述,在确定性能时,请务必查看特定配置和需求。

我猜想如果你在循环中调用代码是一个问题。 但找到答案的最好方法是计时,看看自己需要多长时间。

 var sw = new Stopwatch(); sw.Start(); today = DateTime.Today(); sw.Stop(); var ts = stopWatch.Elapsed; 

MSDN秒表参考

DateTime.Today提取为变量的真正原因是为了防止因Murphy定律而出现的可能的错误,但永远不会被隔离和修复。

想法是在Today第一次和第二次使用之间可以改变实际日期,所以你可以在这里获得例如上一年和新月:

 var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1); 

例如,可能会导致(January 2013) - 1 month而不是(December 2013) - 1 month

如果你在firstlast任务之间得到日期变更,那么更可能和更邪恶的问题是:

 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); 

这将导致一年多的时间..根据您的逻辑,它可能导致非常昂贵的损失。

比性能问题更重要的是代码的可读性和可维护性。

除非你没有性能问题我会遵循“注意性能改进”的规则

也许如果你有一个循环而不是一个变量可以命名为“今天”,但只要没有表现,我会关注其他问题