15

我刚看到这条点赞的评论

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

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

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

4

7 回答 7

9

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

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

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

更新

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

于 2013-04-03T15:29:00.383 回答
6

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

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());
于 2013-04-03T15:36:21.130 回答
3

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

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

于 2013-04-03T15:29:01.807 回答
2

有关性能的硬数字,DateTime请阅读此博客文章。正如先前的答案所述,在确定性能时查看您的特定配置和需求非常重要。

于 2013-04-03T15:30:33.273 回答
1

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

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

MSDN 秒表参考

于 2013-04-03T15:34:35.137 回答
1

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

想法是Today实际日期的第一次和第二次使用之间可能会发生变化,因此您可以在此处获取例如上一年和新月份:

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

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

first如果您在分配和分配之间获得日期更改,则更有可能和更邪恶的问题last

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

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

于 2013-04-03T15:52:28.783 回答
0

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

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

也许如果你有一个循环而不是一个变量可以用“今天”适当地命名,但只要没有发布性能,我就会关注其他问题

于 2013-04-03T15:29:20.377 回答