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

时间:2013-04-03 15:25:12

标签: c# performance datetime

我刚看到this upvoted comment

  

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

如果我希望提高性能,将DateTime.Today存储在变量中而不是多次调用它有多重要?大致有多少DateTime.Today用于证明为它创建变量的合理性?

编辑我意识到我应该先测试一下我的程序,看看是否存在性能问题,然后才会担心这个问题很简单。为了这个问题,假设我已经这样做并确定需要进行额外的优化。

7 个答案:

答案 0 :(得分:9)

  

将DateTime.Today存储在变量

中有多重要

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

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

<强>更新

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

有关DateTime阅读this blog post的效果的硬数字。如前所述,在确定性能时,请务必了解您的特定配置和需求。

答案 4 :(得分:1)

如果您在循环中调用代码,我猜这是一个问题。但最好的方法是找出时间并亲自了解需要多长时间。

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

MSDN Stopwatch reference

答案 5 :(得分:1)

DateTime.Today提取为变量的真正原因是为了防止由于Murphy's law而出现 的错误,但永远不会被隔离并修复..

想法是在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);

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

答案 6 :(得分:0)

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

除非您没有性能问题,否则我会遵循“注意性能改进”这一规则

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