C# 对于DateTime.Today来说,在关注性能时使用变量有多重要?

C# 对于DateTime.Today来说,在关注性能时使用变量有多重要?,c#,performance,datetime,C#,Performance,Datetime,我刚看到 IIRCDateTime.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); 如果我希望

我刚看到

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
可以为它创建一个变量

编辑:我意识到我应该先测试我的程序,看看是否有性能问题,然后再担心像这样琐碎的事情。对于这个问题,假设我已经做了这项工作,并确定需要额外的优化

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

最好的解决方法是在您希望代码运行的硬件上进行基准测试。除非你把它称为一个非常紧密的循环,否则我怀疑这会是一个问题

将其存储在变量中的一个更好的原因是,在两次调用之间,您可能会从一天滚动到下一天

更新


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

我拒绝
日期时间的前提。今天的
是一个昂贵的呼叫。如果不随时间变化很重要,则应将其存储在变量中。如果这段代码在月底的午夜左右运行,您可能会遇到…问题。从性能的角度来看,我非常怀疑这会是一个问题


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

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

除非您没有性能问题,否则我将遵循“关注性能改进”的规则


如果你有一个循环,那么一个变量可以用“today”来命名为合适的,但只要没有发布性能,我会把注意力集中在其他问题上,关于
DateTime
read性能的硬数字。正如前面的回答所述,在确定性能时,查看您的特定配置和需求非常重要。

如果您在循环中调用代码,我想这是一个问题。但最好的办法是确定时间,自己看看需要多长时间

var sw = new Stopwatch();
sw.Start();
today = DateTime.Today();
sw.Stop();
var ts = stopWatch.Elapsed;
基准测试(在我的机器上,使用秒表类):

代码:

var s=新秒表();
DateTime日期=DateTime.Today;
DateTime date2=DateTime.Today;
s、 Start();

对于(int i=0;i提取
DateTime.Today
作为变量的真正原因是为了防止可能出现的错误,将出现,但永远不会被隔离和修复

这个想法是,在第一次和第二次使用
今天
实际日期之间可能会发生变化,因此您可以在此处获得上一年和新月份等信息:

var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);
例如,这可能导致
(2013年1月)-1个月,而不是
(2013年12月)-1个月

如果您在
第一次
最后一次
分配之间发生日期更改,则更可能出现更糟糕的问题:

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

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

就我个人而言,如果我希望
今天的
值在所有使用中都相同,我只会使用一个变量。否则,我会编写可读性代码,并忽略性能问题,直到它成为热点。当然,如果性能是paramount那么最明显的答案就是每次使用一个变量2次或2次以上。在它成为一个问题之前,有多少次是完全主观的,但我想在它成为一个问题之前,它需要很多调用。我认为你应该写一个程序来测试它,并公布结果!旁注:这段代码的主要问题是它是not correct-想象一下,当今天对
的两个调用到达不同的日期时,每天/每年会发生一次什么。它还表明,今天的
/
现在的
不可作为“新年”的单元测试进行测试条件并不是那么简单——所以即使付出一些性能成本和测试结果,您也最好抽象这个调用……我刚做了100000次,大约花了37-38分钟ms@Cemafor:我会发布我的代码。它在一个大约2年前的四核戴尔Precision工作站上。我从你的回答中得出的结论是,可以安全地假设今天,
DateTime.Today
是一个“昂贵”的调用的说法是不真实的(至少在今天的技术中是这样)。这是一个比读取变量更昂贵的调用,但调用本身并不昂贵,除非我尝试微优化您的代码,否则我不应该真的担心它。谢谢:)@瑞秋:如果两个数量级没有显著差异,那么是的,我想你可以得出这个结论我可以多次看到DateTime被调用的唯一可能场景是在报表或批处理中,为此,我可能会缓存该值,原因是此处其他人提到的与性能无关的原因(很可能有人在午夜前一分钟运行报表或批处理)@RobertHarvey:我在一台配备i7-2630gm@2.00GHz的联想thinkpad上。我使用的代码
var first = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1).AddMonths(-1);
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);